我最近需要修改一些Java代码(添加方法,更改某些字段的签名和删除方法),我认为可以通过使用Eclipse SDK的AST来完成所有这些。
我知道如何解析源文件,但不知道如何做上述事情。有人知道一个好的教程或者能给我一个简要的解释如何解决这些问题吗?
非常感谢,
ExtremeCoder
编辑:
我现在开始更深入地研究JCodeModel,我认为这可能更容易使用,但我不知道是否可以将现有文档加载到其中?
如果可以,请让我知道;)
再次感谢。
我最近需要修改一些Java代码(添加方法,更改某些字段的签名和删除方法),我认为可以通过使用Eclipse SDK的AST来完成所有这些。
我知道如何解析源文件,但不知道如何做上述事情。有人知道一个好的教程或者能给我一个简要的解释如何解决这些问题吗?
非常感谢,
ExtremeCoder
编辑:
我现在开始更深入地研究JCodeModel,我认为这可能更容易使用,但我不知道是否可以将现有文档加载到其中?
如果可以,请让我知道;)
再次感谢。
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());
}
}
}
}
这应该能帮助你们入门。
需要一些时间来适应这个(在我这里需要很长时间)。但它确实有效,是我找到的最好的方法。
祝你好运;)
ExtremeCoder
编辑:
在我忘记之前,这些是我用来使其工作的导入项(我花了相当长的时间来组织它们):
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代表版本号。
add_int_parameter(p:parameter_list, i: identifier): parameters -> parameters
" \p " -> " \p , int \i";
向参数列表中添加一个任意名称的整数参数。这可以实现与整套API调用相同的效果,但更易读,因为它在您语言的表面语法中(在本例中为Java)。
我们的DMS软件重构工具包可以接受这样的程序转换并将其应用于许多语言,包括Java。