【问题标题】:Is there any way to convert the test code to a MethodDeclaration using Eclipse JDT?有没有办法使用 Eclipse JDT 将测试代码转换为 MethodDeclaration?
【发布时间】:2014-03-24 06:53:46
【问题描述】:

假设我已经从 Java 文件中解析了一个 CompilationUnit 单元。现在,我想在 Java 文件中添加一些新的复杂方法。用简单的方法比如

public static void main(String[] args) {
    System.out.println("Hello" + " world");
}

我们可以手动编程,例如:http://publib.boulder.ibm.com/infocenter/rsmhelp/v7r0m0/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_manip.htm

但是,用复杂的方法,这似乎是不可能的。我认为另一种解决方案是:将整个方法存储到一个字符串中,然后对其进行解析并将结果添加到现有的编译单元中。

有没有办法将测试代码转换为 MethodDeclaration,然后使用 eclipse JDT 附加到现有的编译单元?

【问题讨论】:

    标签: java eclipse-jdt


    【解决方案1】:

    我在这里假设您说的是org.eclipse.jdt.core.dom 包中的CompilationUnitMethodDeclaration

    但是,用复杂的方法,这似乎是不可能的。

    实际上,您可以理论上使用org.eclipse.jdt.core.dom API 创建任何可能的合法Java 代码,方法是使用各种AST#new-methods 创建和链接相应的ASTNodes

    对于复杂的代码,使用ASTParser 解析现有语句会更方便。为此,您必须首先将解析器的源设置为语句的代码,然后将解析器种类设置为ASTParser.K_STATEMENTS。然后,当通过调用ASTParser#createAST 创建一个ASTNode 时,返回的节点将是Block 类型。在您可以将此块设置为例如之前MethodDeclaration 的块,您必须通过调用 ASTNode.copySubtree(ast, block) 将该块复制到现有的 AST

    这是一个完整的例子,展示了如何做到这一点:

    import org.eclipse.jdt.core.dom.AST;
    import org.eclipse.jdt.core.dom.ASTNode;
    import org.eclipse.jdt.core.dom.ASTParser;
    import org.eclipse.jdt.core.dom.Block;
    import org.eclipse.jdt.core.dom.CompilationUnit;
    import org.eclipse.jdt.core.dom.MethodDeclaration;
    import org.eclipse.jdt.core.dom.TypeDeclaration;
    
    public class JdtDomExample {
    
        public static void main(String[] args) {
    
            // (1) somehow get an org.eclipse.jdt.core.dom.CompilationUnit, a TypeDeclaration, and a MethodDeclaration
            AST ast = AST.newAST(AST.JLS8);
            CompilationUnit cu =  ast.newCompilationUnit();
            TypeDeclaration typeDecl = ast.newTypeDeclaration();
            typeDecl.setName(ast.newSimpleName("MyClass"));
            cu.types().add(typeDecl);
            MethodDeclaration method = cu.getAST().newMethodDeclaration();
            method.setName(ast.newSimpleName("myMethod"));
            typeDecl.bodyDeclarations().add(method);
    
            // (2) create an ASTParser and parse the method body as ASTParser.K_STATEMENTS
            ASTParser parser = ASTParser.newParser(AST.JLS8);
            parser.setSource("System.out.println(\"Hello\" + \" world\");".toCharArray());
            parser.setKind(ASTParser.K_STATEMENTS);
            Block block = (Block) parser.createAST(null);
    
            // (3) copy the statements to the existing AST
            block = (Block) ASTNode.copySubtree(ast, block);
            method.setBody(block);
    
            // show the result
            System.out.println(cu);
        }
    }
    

    输出:

    class MyClass {
      void myMethod(){
        System.out.println("Hello" + " world");
      }
    }
    

    【讨论】:

    • 非常感谢您提供清晰的答案和源代码。它符合我的要求。
    猜你喜欢
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多