在Java中,是否可以在应用程序运行时动态创建类定义,然后创建该类的对象?

例如,正在运行的应用程序将读入一个文本文件,其中包含要包含在新类中的类成员列表。然后,应用程序将根据成员列表定义一个类定义,然后实例化它。

有帮助吗?

解决方案

是的,理论上可以这样做,您的类文件是字节代码,最后是字节数组!然后,您可以使用方法defineClass(String, byte[], int, int)来获取可用于通过反射实例化对象的Class实例。

在实践中你可以使用类似的东西 CG库 或者 java助手.

您还可以使用在文件中生成 java 代码、调用编译器、然后加载文件的长方法。

其他提示

可以动态地生成使用 ASM

的类

您可以通过为新类中的代码写入文件,然后调用在该文件中的Java编译器,并使用一个类加载器的那类动态加载到运行的应用程序做到这一点。 Apache Tomcat上做这行的JSP页面;它需要的代码,做了一些修改它,把它包装在一个类,它然后写入到文件系统,编译它的中间有一个try / catch块,并使用一个类加载器来获取和起诉其服务请求。

当然是可能的。例如参见此文章

也许是 最简单的 解决方案(就不需要额外的库而言)是使用 Java编译器API Java 6 附带的。您只需生成 .java、编译然后执行 Class.forName() 即可。

也许有点矫枉过正,所述阿帕奇BCEL (字节代码工程库)可以用来在运行时期间创建class文件。

虽然我还没有尝试过它自己,可以想象,一个然后可以创建一个类,加载它,并且在运行时实例化。

是,这是可能的。

可以通过在运行时创建与了Javassist 类定义的类的主体,使Javassist进行编译的新类。

Javassist是有根据您的类定义创建一个字节码编译器定制。它有一些特别的方式来处理事情,但它是非常容易和直观地使用这个库。

了Javassist使用JBoss上,我认为这是一个很好的参考:)

这也可以用 BCEL 来实现,但它是非常困难的(但这样你有超过产生什么更多的控制)。

您也许可以,如果你必须做类似的东西在JRuby,或JPython的或Groovy。

如果你觉得特别自虐你可以看看 BCEL

如果您想Java和元编程,使用 Groovy的

ASM 是Java的最低水平字节码库,我想。这使得它很难,但也非常强大。我建议你阅读ASM的文档( PDF )要真正了解字节码生成在Java中工作。该文档还解释了如何加载的类加载器字节码(另一个硬盘题目做对)。

这之后您可以使用更高级别的图书馆之一,如果它使你的生活更轻松,并了解他们在做什么。对于许多情况下,诸如生成代理,所述 CGLIB 是有用的,使用简单。更多的权力,许多人提到了Javassist (我的天堂”吨使用它 - CGLIB和ASM已经为我好)

有在这里有关的内存编译这应该给你,你已经成功地生成源代码后,该怎么做一些提示。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top