【问题标题】:Creating new classes from code从代码创建新类
【发布时间】:2011-09-09 19:53:32
【问题描述】:

有没有办法在执行期间创建一个新的 java 类?关于类的所有信息(名称、修饰符、方法、字段等)都存在。现在我想创建那个类。一个想法是创建一个新文件并将内容写入该文件,c'est fini!但我认为有更优雅的方法可以做到这一点,也许使用 JDT?

【问题讨论】:

  • 你真的需要这个吗?听起来有点 hacky...
  • @Tobiask,很多中间件都可以做到。这是相当常见的任务(简单的 JSP 就是这样),需要一些库,如 ASM/BCEL 和自定义类加载器,然后就完成了。
  • @bestsss 好的,谢谢

标签: java eclipse class reflection eclipse-jdt


【解决方案1】:

要么使用BCEL 创建字节码和类文件(硬方式),要么在内存中创建源代码并使用Java 6 Compiler API(我会这样做)。但是对于 Compiler API,您在运行应用程序时需要 Java SDK,而 JRE 是不够的。

进一步阅读

(网上有很多教程)

【讨论】:

    【解决方案2】:

    如果您正在编写 Eclipse 插件,并且希望您的工具将代码生成到项目中,您可以使用 AST 与 JDT 进行交互。还有一种方法可以从运行时调用 Eclipse 批处理编译器。

    AST ast = AST.newAST(AST.JLS3);
    CompilationUnit unit = ast.newCompilationUnit();
    PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
    packageDeclaration.setName(ast.newSimpleName("example"));
    unit.setPackage(packageDeclaration);
    ImportDeclaration importDeclaration = ast.newImportDeclaration();
    QualifiedName name = 
        ast.newQualifiedName(
        ast.newSimpleName("java"),
        ast.newSimpleName("util"));
    importDeclaration.setName(name);
    importDeclaration.setOnDemand(true);
    unit.imports().add(importDeclaration);
    TypeDeclaration type = ast.newTypeDeclaration();
    type.setInterface(false);
    type.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
        type.setName(ast.newSimpleName("HelloWorld"));
    // ....
    

    啰嗦 :-) 但您可以随时访问 JDT java 核心模型。

    如果您需要在 Eclipse 工作区中生成文件,还有基于模板的选项,例如 JET

    但如果您想在 Java 应用程序的运行时动态生成和加载 .class 文件,请尝试@Andreas_D 建议。

    【讨论】:

      【解决方案3】:

      查看代码生成库, http://cglib.sourceforge.net/ http://www.csg.is.titech.ac.jp/~chiba/javassist/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多