在 Java 应用程序运行时定义类
-
13-09-2019 - |
题
在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已经为我好)
有在这里有关的内存编译这应该给你,你已经成功地生成源代码后,该怎么做一些提示。