RCP: JDT 根据org.eclipse.jdt.core.IJavaElement对象获取org.eclipse.jdt.core.dom.ASTNode对象

简介: JDT中有两套Java文件模型映射。 其核心类\接口分别为: org.eclipse.jdt.core.IJavaElement和org.eclipse.jdt.core.dom.ASTNode   IJavaElement是Java Element的通用“协议”,即是对Java包、类、方法、变量、注解等等元素的规范。

 

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();
		}

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

 

目录
相关文章
N..
|
JavaScript 前端开发 UED
DOM编程中的form对象
DOM编程中的form对象
N..
97 0
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
12月前
|
XML 编解码 JavaScript
DOM(文档对象模型)和 BOM(浏览器对象模型)
【10月更文挑战第19天】在前端开发中,理解 DOM(文档对象模型)和 BOM(浏览器对象模型)是至关重要的。它们是 Web 开发的基础,为我们提供了与网页文档和浏览器进行交互的能力。
1264 62
|
JavaScript 前端开发
js之DOM 文档对象模型
js之DOM 文档对象模型
70 1
js之DOM 文档对象模型
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
173 1
|
JavaScript 前端开发 API
前端开发者的救赎:揭秘JQ对象与DOM元素的神秘转换术
【8月更文挑战第23天】在Web前端开发领域,jQuery(简称JQ)作为一款流行的JavaScript库,极大简化了HTML文档遍历、事件处理、动画及Ajax交互等操作。理解和掌握jQuery对象与DOM元素间的转换至关重要。
113 0
|
JavaScript 前端开发 算法
虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。
【6月更文挑战第27天】虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。当状态改变,React不直接修改DOM,而是先构建新的虚拟DOM树。通过 diff 算法比较新旧树,找到最小变更,仅更新必要部分,提高性能,避免频繁DOM操作。虚拟DOM还支持跨平台应用,如React Native。它优化了更新流程,简化开发,并提升了用户体验。
141 1
|
JavaScript 前端开发
js之DOM 文档对象模型
js之DOM 文档对象模型
|
XML 存储 JavaScript
DOM(文档对象模型):理解网页结构与内容操作的关键技术
**DOM摘要:**文档对象模型(DOM)是独立于语言的接口,用于访问和修改HTML或XML文档。HTML DOM用于HTML,XML DOM用于XML。示例展示了如何用JavaScript通过DOM获取和修改元素,如通过ID或标签名。XML DOM涉及加载XML文件或字符串,获取元素值。DOM节点包括文档、元素、文本等,通过属性(如nodeName, nodeValue)和方法(如getElementsByTagName, appendChild)操作。节点树结构允许遍历和修改文档结构。
169 2
DOM(文档对象模型):理解网页结构与内容操作的关键技术
|
XML JavaScript 前端开发
JavaScript简介&引入方式(JavaScript基础语法、JavaScript对象、BOM、DOM、事件监听)
JavaScript简介&引入方式(JavaScript基础语法、JavaScript对象、BOM、DOM、事件监听)
104 2