【问题标题】:Create JCodeModel from existing source file(s)从现有源文件创建 JCodeModel
【发布时间】:2014-12-12 09:58:07
【问题描述】:

我想用可能在语法上无效的代码 sn-ps 创建 Java 源代码。 com.sun.codemodel.JBlock#directStatement() method 可以做到这一点。

我的问题是,我想修改现有的(语法有效的)源文件,但我找不到从文件(或字符串或流等)创建 JCodeModel 的方法。

有没有办法用 JCodeModel 做到这一点?

(我可以改用 Eclipse JDT/AST 框架,但它apparently doesn't offer the option to add code snippets directly...)

【问题讨论】:

  • 可以从源文件中获取 JClass 对象。不幸的是,我找不到从中获取 JDefinedClass 的方法。您确实可以从中获取 JCodeModel,但它的包中不包含任何 JDefinedClass 对象。
  • 您能否将确切的代码发布到您的问题中?
  • @pratikch 据我所知,您的链接没有提供解决方案。我究竟应该尝试什么?
  • @Hasanein Khafaji 什么代码?我的部分问题是,似乎没有任何代码。 :)

标签: java code-generation sun-codemodel


【解决方案1】:

您可以使用JavaParser 来有效解析您的代码,并使用解析结果,您可以使用JCodemodel 进行操作。

【讨论】:

    【解决方案2】:

    恕我直言,一种方法可能是这样的。

    • 试着看看你想用

      实现什么

      现有的(语法上有效的)源文件

    • 然后确定是否可以通过继承或包含生成的类中的类来修改它们而不修改它们。这将在生成的代码和已经创建的代码中提供清晰的分离。

    • 如果不可能,请尝试在现有(语法有效)类中使用诸如访问者之类的设计模式,并将生成的代码类实例注入其中以完成工作。

    • 最坏的情况 - 最后一个选择是真正修改现有的类。

    【讨论】:

      【解决方案3】:

      我建议您不要使用 JAVA 代码操作(使用程序中的 JAVA 代码操作非常复杂),而是使用 JAVA 字节码操作。三个常用的字节码操纵器是:

      如果您确实需要使用源代码进行操作,您可以查看Eclipse JDTASTRewrite 类。 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);
      }
      });
      

      教程:

      【讨论】:

      • 不幸的是,这不是一个选项。我创建了教育软件,其中 UML 活动图被翻译成 Java 源代码,这是学生的直接输出/反馈。
      • 在这种情况下,可以选择 Eclipse JDT 的 ASTRewrite。请参阅扩展答案。
      • 使用 JDT 我遇到了插入语法无效代码的问题:stackoverflow.com/questions/13801305/…
      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 2018-01-28
      • 2017-02-22
      • 1970-01-01
      相关资源
      最近更新 更多