动态代码执行

Sid*_*Sid 9 java

与动态SQL类似,其中String在运行时作为SQL执行,我们可以动态运行Java代码吗?就像我返回一个字符串,它是一个Java代码,然后我在运行时执行.这可能吗?

Mic*_*rdt 15

对于真正的Java代码,可以使用该JavaCompiler接口.然而,它使用起来非常不方便,因为它只是一个真正的Java编译器,预计编译文件中发现整个类定义的接口.

执行运行时提供的代码的最简单方法是使用Rhino JavaScript引擎.

这两个选项都只在Java 6中使用,但我相信之前存在脚本接口,因此如果下载并将其添加到类路径中,则可以在早期的JRE中使用Rhino.


And*_*yle 6

了Javassist

您需要使用字节码操作库(如Javassist(Wikipedia)),以便运行在运行时提供的任意字符串.Javassist允许您CtClass基于表示源代码的字符串创建; 然后可以Class通过特定的类加载器将其转换为编译对象,以便该类可供您的应用程序使用.其他库需要执行类似于这两个步骤的操作才能实现相同的功能.

所以它是可能的,但它非常重量级,很可能使你的应用程序很难推理.如果可能的话,考虑静态地设计一个非常灵活的类,并让它接受控制其行为的参数.

  • +1 - 有关可能库的完整列表:http://java-source.net/open-source/bytecode-libraries (3认同)