JDT中有两套Java文件模型映射。

其核心类\接口分别为:

org.eclipse.jdt.core.IJavaElement和org.eclipse.jdt.core.dom.ASTNode

IJavaElement是Java Element的通用“协议”,即是对Java包、类、方法、变量、注解等等元素的规范。

它可以用于映射java文件,也可以映射class文件,任何java方面的元素都能找到其对应的实现类。

ASTNode是Java ast(语法分析树)的建模,用于构建java语句,它只能用于java文件分析,对class文件无能为力。其侧重点是语法。

举个例子,一个类,比如java.util.List

在IJavaElement中要使用,必须有java.util.List作为IType存在。

在ASTNode中使用,则只需要用户知道“java.util.List"这个字符串即可。

IJavaElement常用于分析Java相关的元素

ASTNode常用来解析和构建Java文件

在实际使用中,我们经常会涉及到两个实现类之间的转化。

比如根据IMethod来查找MethodDeclaration

JDT提供了一个方法的工具类NodeFinder。使用方式如下:

NodeFinder.perform(domUnit,
method.getSourceRange())

这里要特别注意的是sourceRange,它代表了指定对象(类、方法等)在java类定义里的储存位置,它有两个标量,offset和length。

所以,我们还可以使用以下方式:

 NodeFinder.perform(domUnit,mj.getOffset(),ms.getLength());

这里要特别注意的地方是,如果该method的源码具备注释(comment),该方法会产生问题,会找不到MethodDeclaration,取而代之的是父级的TypeDeclaration。

原因在于jdt(至少是3.7.0及更早版本)的BUG,IMethod记录comment的offset和length,但是ASTNode并没有相应的记录,如果使用上方的方法,NodeFinder会认为范围超限,属于类范围而非方法范围。

所以,我们需要一个小小的改动:

IMethod method = (IMethod) methodElement
.getAncestor(IJavaElement.METHOD);
try {
ISourceRange ms = method.getSourceRange();
ISourceRange mj = method.getJavadocRange(); if (ms.getOffset() == mj.getOffset()) {
// 消除注释的影响
return (MethodDeclaration) NodeFinder.perform(domUnit,
method.getSourceRange());
} else {
return (MethodDeclaration) NodeFinder.perform(domUnit,
mj.getOffset(),
ms.getLength() - mj.getOffset() + ms.getOffset());
}
} catch (JavaModelException e) {
e.printStackTrace();
}

注意红色部分,它用于去除多余的注释部分,计算出准确的方法体范围。

RCP: JDT 根据org.eclipse.jdt.core.IJavaElement对象获取org.eclipse.jdt.core.dom.ASTNode对象的更多相关文章

  1. Eclipse IDE for Java EE Developers 与 Eclipse Classic(Eclipse Standard)区别

    Eclipse下载官网:http://www.eclipse.org/downloads/ 版本: 1.Eclipse classic(Eclipse Standard):Eclipse的标准版; 2 ...

  2. 无法访问org.springframework.core.NestedRuntimeException 找不到org.springframework.core.NestedRuntimeException的类文件

    在学习springAOP时,出现如下异常: 无法访问org.springframework.core.NestedRuntimeException 找不到org.springframework.cor ...

  3. MySQL官方.NET Core驱动已出,支持EF Core

    千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...

  4. Core Data系列文章(一)Core Data基础

    在iOS开发数据库SQLite的使用介绍了iOS中使用SQLite对数据进行持久化存储,实际上是对数据库直接进行操作,而苹果专门有一套API来间接的对数据进行持久化存储,而且主要针对用户创建的对象 - ...

  5. NET Core驱动已出,支持EF Core

    NET Core驱动已出,支持EF Core 千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功 ...

  6. Eclipse安装反编译工具JadClipse for Eclipse手把手教程

    今天闲来无事准备弄弄eclipse的反编译工具JadClipse for Eclipse,百度经验里也说的比较清楚只是两个文件下载地址没有明确 net.sf.jadclipse_3.3.0.jar   ...

  7. 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】

    Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...

  8. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. [小技巧]EF Core中如何获取上下文中操作过的实体

    原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...

随机推荐

  1. 百度UEditor基本使用

    1 首先奉上链接其http://ueditor.baidu.com/website/index.html 更多更详细内容在其官方api上,本文只是一个归类总结性文章. 2 下载链接http://ued ...

  2. Bash Shell字符串操作

    转自:http://my.oschina.net/aiguozhe/blog/41557,并对内容作了验证修改. 1. 取长度 str="abcd" 2.查找子串的位置 貌似也只有 ...

  3. rdlc报表DEMO

    rdlc报表demo  .net 4.0  vs2013 文本框,图像控件,checkbox样式的打印 下载链接

  4. create()创建的控件不能映射消息函数的解决

    有时,使用create()在运行时创建的控件不能将消息映射到父窗口内,此时需要使用消息转发的机制,主要原理:注册一个全局的消息,针对接收消息的控件编写继承类,在该继承类中响应消息,并将已注册的全局消息 ...

  5. 交换机的link-dependency链路依赖功能

    在生产环境中,如果各主机连接到交换机的1-16端口,交换机的18端口上联到外部网络,如果此时交换机的18端口断掉,在主机端网卡仍然有连接,对于一些网络的配置可能就感知不到外部连接的消失,会有问题(如E ...

  6. 17.iOS App设置icon,启动图,App名称的方法

    icon:选择Assets-->AppIcon-->将各种尺寸的icon拖拽到相应的框中. APP名称:选择info-->Bundle name,修改APP名字. 启动图: 首先点击 ...

  7. URI和URL、URN区别

    URI不能读取/写入资源,这是统一的资源定位器(URL)的任务.URL是一种URI,它的schema是已知的网络协议,并且它把URI与某种协议处理程序联系起来(一种与资源通讯的读/写机制).URI一般 ...

  8. MAC PRO 的网关在哪里

    mac pro的网关就是路由器地址. 1.路由器在系统偏好设置里 2.双击点开此图标 选中1.然后点击高级设置 3.选中TCP/IP,然后查看自己的路由器后边的数字,就是你的mac网关号 4.IPV4 ...

  9. viewpage滑动查看图片并再有缩略图预览

    首先看下效果图, 主要功能分为3大块 一是滑动查看,通过viewpage来实现,方法见 http://www.cnblogs.com/lovemo1314/p/6109312.html 二.点击放大 ...

  10. hdu 5543 Pick The Sticks(动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意:给你一根长为m的长木板和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放在长木板上 ...