gpt4 book ai didi

java - 有什么方法可以使用 Eclipse JDT 将测试代码转换为 MethodDeclaration 吗?

转载 作者:行者123 更新时间:2023-11-30 11:20:39 27 4
gpt4 key购买 nike

假设我已经从 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 附加到现有的编译单元?

最佳答案

我假设您说的是 CompilationUnit和一个 MethodDeclarationorg.eclipse.jdt.core.dom包。

However, with complex method, it seems to be impossible.

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

然而,对于复杂代码,使用 ASTParser 解析现有语句会更方便.为此,您必须首先将解析器的源设置为语句的代码,然后将解析器类型设置为 ASTParser.K_STATEMENTS。然后,当通过调用 ASTParser#createAST 创建 ASTNode 时,返回的节点类型为 Block .在您可以将此 block 设置为例如之前MethodDeclaration 的 block ,您必须通过调用 ASTNode.copySubtree(ast, block) 将 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");
}
}

关于java - 有什么方法可以使用 Eclipse JDT 将测试代码转换为 MethodDeclaration 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22602792/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com