我想使用可能在语法上无效的代码片段创建 Java 源代码。这可以通过com.sun.codemodel.JBlock#directStatement() 方法实现。
我的问题是,我想修改现有的(语法上有效的)源文件,但我找不到从文件(或字符串或流等)创建 JCodeModel 的方法。
有没有办法用 JCodeModel 做到这一点?
(我可以改用 Eclipse JDT/AST 框架,但它显然不提供直接添加代码片段的选项......)
我想使用可能在语法上无效的代码片段创建 Java 源代码。这可以通过com.sun.codemodel.JBlock#directStatement() 方法实现。
我的问题是,我想修改现有的(语法上有效的)源文件,但我找不到从文件(或字符串或流等)创建 JCodeModel 的方法。
有没有办法用 JCodeModel 做到这一点?
(我可以改用 Eclipse JDT/AST 框架,但它显然不提供直接添加代码片段的选项......)
您可以使用JavaParser有效地解析您的代码,并使用解析结果,您可以使用 JCodemodel 进行操作。
恕我直言,一种方法可能是这样的。
试着看看你想用
现有的(语法有效的)源文件
然后确定是否可以通过继承或包含生成的类中的类来修改它们而无需修改它们。这将在生成的代码和已经创建的代码中提供清晰的分离。
如果不可能,请尝试在现有(语法有效)类中使用诸如访问者之类的设计模式,并将生成的代码类实例注入其中以完成工作。
最坏的情况 - 最后一个选项将是真正修改现有的类。
我建议您不要使用 JAVA 代码操作(使用程序中的 JAVA 代码操作非常复杂),而是使用 JAVA 字节码操作。三个常用的字节码操纵器是:
如果您确实需要使用源代码进行操作,您可以查看Eclipse JDT和ASTRewrite类。Bellow 是一个如何创建方法和
final ASTRewrite rewrite= new ASTRewrite(root);
root.accept(new ASTVisitor() {
public boolean visit(Assignment assignment) {
// check if affected
AST ast= assignment.getAST();
MethodInvocation setter= ast.newMethodInvocation();
setter.setName(ast.newSimpleName(setterName));
setter.arguments().add(
rewrite.createMoveTarget(assignment.getRightHandSide()));
rewrite.replace(assignment, setter);
}
});
教程: