从代码创建新类

发布于 2024-11-14 08:31:17 字数 124 浏览 5 评论 0原文

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

Is there a way to create a new java class during execution? All the information about the class (name, modifiers, methods, fields, etc.) exists. Now I want to create that class. An idea was to create a new file and write the stuff to that file, c'est fini! But I think there are more elegant ways to do that, maybe with JDT?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

真心难拥有 2024-11-21 08:31:17

要么使用 BCEL 创建字节代码和类文件(困难的方法),要么在内存中创建源代码并使用 Java 6 编译器 API(这就是我要做的)。但是使用 Compiler API,您在运行应用程序时需要 Java SDK,JRE 是不够的。

进一步阅读

(网上有很多教程)

Either use BCEL to create byte code and class files (the hard way) or create the source code in memory and use the Java 6 Compiler API (that's what I would do). But with Compiler API you need a Java SDK while running the application, a JRE is not sufficient.

Further Reading

(There a lot of tutorials on the web)

别忘他 2024-11-21 08:31:17

如果您正在编写 Eclipse 插件,并且希望工具将代码生成到项目中,则可以使用 AST。还有一种方法可以从运行时调用 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 工作区中生成文件,还有基于模板的选项,例如 喷射

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

If you are writing an eclipse plugin and you want your tooling to generate code into a project, you can interact with JDT using the AST. There is also a method to call the Eclipse batch compiler from your runtime.

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"));
// ....

Long winded :-) but you have access to the JDT java core model as you go.

If you need to generate files into your eclipse workspace, there are also template based options, like JET.

But if you want to dynamically generate and load a .class file in the runtime of a java application try @Andreas_D suggestions.

笑,眼淚并存 2024-11-21 08:31:17

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

Look at code generation libraries,
http://cglib.sourceforge.net/
http://www.csg.is.titech.ac.jp/~chiba/javassist/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文