我最近开始需要修改一些 Java 代码(添加方法、更改某些字段的签名和删除方法),我认为所有这些都可以通过使用 Eclipse SDK 的 AST 来完成。
我从一些研究中知道如何解析源文件,但我不知道如何做上面提到的事情。有谁知道一个好的教程,或者有人可以简要解释一下如何解决这些问题?
非常感谢,
极限编码器
编辑:
我现在开始更多地研究 JCodeModel,我认为这可能更容易使用,但我不知道是否可以将现有文档加载到其中?
如果这可行,请告诉我;)
再次感谢。
我最近开始需要修改一些 Java 代码(添加方法、更改某些字段的签名和删除方法),我认为所有这些都可以通过使用 Eclipse SDK 的 AST 来完成。
我从一些研究中知道如何解析源文件,但我不知道如何做上面提到的事情。有谁知道一个好的教程,或者有人可以简要解释一下如何解决这些问题?
非常感谢,
极限编码器
编辑:
我现在开始更多地研究 JCodeModel,我认为这可能更容易使用,但我不知道是否可以将现有文档加载到其中?
如果这可行,请告诉我;)
再次感谢。
我不会在这里发布这个问题的全部源代码,因为它很长,但我会让人们开始。
您需要的所有文档都在这里:http: //publib.boulder.ibm.com/infocenter/iadthelp/v6r0/index.jsp ?topic=/org.eclipse.jdt.doc.isv/reference/api/org /eclipse/jdt/core/dom/package-summary.html
Document document = new Document("import java.util.List;\n\nclass X\n{\n\n\tpublic void deleteme()\n\t{\n\t}\n\n}\n");
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(document.get().toCharArray());
CompilationUnit cu = (CompilationUnit)parser.createAST(null);
cu.recordModifications();
这将从您传入的源代码中为您创建一个编译单元。
现在这是一个简单的函数,可以打印出您传递的类定义中的所有方法:
List<AbstractTypeDeclaration> types = cu.types();
for(AbstractTypeDeclaration type : types) {
if(type.getNodeType() == ASTNode.TYPE_DECLARATION) {
// Class def found
List<BodyDeclaration> bodies = type.bodyDeclarations();
for(BodyDeclaration body : bodies) {
if(body.getNodeType() == ASTNode.METHOD_DECLARATION) {
MethodDeclaration method = (MethodDeclaration)body;
System.out.println("method declaration: ");
System.out.println("name: " + method.getName().getFullyQualifiedName());
System.out.println("modifiers: " + method.getModifiers());
System.out.println("return type: " + method.getReturnType2().toString());
}
}
}
}
这应该让你们都开始了。
确实需要一些时间来适应这一点(在我的情况下很多)。但它确实有效,是我能得到的最好的方法。
祝你好运 ;)
极限编码器
编辑:
在我忘记之前,这些是我用来让它工作的导入(我花了很多时间来组织这些):
org.eclipse.jdt.core_xxxx.jar
org.eclipse.core.resources_xxxx.jar
org.eclipse.core.jobs_xxxx.jar
org.eclipse.core.runtime_xxxx.jar
org.eclipse.core.contenttype_xxxx.jar
org.eclipse.equinox.common_xxxx.jar
org.eclipse.equinox.preferences_xxxx.jar
org.eclipse.osgi_xxxx.jar
org.eclipse.text_xxxx.jar
其中 xxxx 表示版本号。
您可以通过调用允许您操作 AST 的 API 使用 Eclipse 来完成此操作。
或者您可以应用程序转换以不依赖于 AST 的微观细节的方式实现您的效果。
例如,您可以编写以下程序转换:
add_int_parameter(p:parameter_list, i: identifier): parameters -> parameters
" \p " -> " \p , int \i";
将具有任意名称的整数参数添加到参数列表中。这实现了与一整套 API 调用相同的效果,但它更具可读性,因为它采用您的语言(在本例中为 Java)的表面语法。
我们的DMS Software Reengineering Toolkit可以接受此类程序转换并将其应用于多种语言,包括 Java。