dynamic代码执行
类似于dynamicSQL,其中一个string在运行时作为SQL执行,我们可以让Java代码dynamic运行吗? 就像我返回一个Java代码的string,然后在运行时执行。 这可能吗?
对于真正的Java代码,可以使用JavaCompiler
接口。 然而,使用起来非常不方便,因为它只是一个真正的Java编译器的接口,希望能够编译文件中的整个类定义。
执行在运行时提供的代码最简单的方法是使用Rhino JavaScript引擎 。
这两个选项都只是在Java 6中,尽pipe我相信以前的脚本接口是存在的,所以如果你下载并将它添加到类path中,你可以在早期的JRE中使用Rhino。
了Javassist
您将需要使用像Javassist ( 维基百科 )这样的字节码操作库,以便运行在运行时提供的任意string。 Javassist允许您基于表示源代码的string创buildCtClass
; 然后可以通过特定的类加载器将其转换为编译的Class
对象,以便该类可用于您的应用程序。 其他库需要做类似于这两个步骤的东西,以达到同样的目的。
所以这是可能的,但它非常重量级,很可能使你的应用程序非常难以推理。 如果可能的话,考虑静态地devise一个非常灵活的类,让它接受控制其行为的参数。
如果你不想dynamic调用一个现有的方法,你可能需要将你的string编译成字节码。 一个简单的方法是将Eclipse / JDT编译器jar包含在你的classpath中,然后你可以使用它将你的String编译成一个Class,然后加载它。
这种types的dynamic代码生成和执行用于将JSP文件转换为Servlet,并用于JasperReports等其他包中,以将报告规范转换为随后调用的类。
请记住,就像使用SQL一样,如果任何string包含用户指定的数据,则必须小心以防止代码注入安全性问题。
您也可以看看Java 6脚本支持: http : //download.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.htm
这里是一个hello世界的版本,它创build一个string数组并打印第一个string:
import javax.script.*; public class EvalScript { public static void main(String[] args) throws Exception { ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval("var a=java.lang.reflect.Array.newInstance(java.lang.String, 1);a[0]='Hello World';print(a[0])"); } }
看看Beanshell 。 它提供了一个Java语法的解释器。
是的,这是可能的。 看看Java编译器API。 看看这里:
http://download.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html
是的使用reflection: 教程
另一个来自IBM的教程