3 回答
TA贡献1856条经验 获得超5个赞
对于真正的Java代码,可以使用该JavaCompiler接口。但是,使用起来非常不便,因为它只是一个真正的Java编译器的接口,该编译器希望编译文件中找到的整个类定义。
执行运行时提供的代码的最简单方法是使用Rhino JavaScript引擎。
这两个选项仅在Java 6中才有,尽管我相信脚本接口以前已经存在,所以如果下载并添加到类路径中,则可以在较早的JRE中使用Rhino。
TA贡献1843条经验 获得超7个赞
Javassist
为了运行在运行时提供的任意字符串,您将需要使用字节码操作库(例如Javassist(Wikipedia))。Javassist允许您CtClass
基于表示源代码的字符串创建一个;然后可以Class
通过特定的类加载器将其转换为已编译的对象,以便该类可用于您的应用程序。其他库需要完成与这两个步骤相似的操作才能实现相同的目的。
因此有可能,但是它非常重,很可能使您的应用程序难以推理。如果有可能,请考虑静态设计一个非常灵活的类,并让它接受控制其行为的参数。
TA贡献1848条经验 获得超10个赞
如果您想做的不仅仅是动态调用现有方法,则可能需要将String编译为字节码。一种简单的方法是在类路径中包含Eclipse / JDT编译器jar,然后可以使用它将String编译为Class,然后可以将其加载。
这种类型的动态代码生成和执行用于将JSP文件转换为Servlet,并在其他程序包(如JasperReports)中使用,以将报告规范转换为可被调用的类。
请记住,与任何SQL一样,如果任何String包含用户指定的数据,则必须小心防止代码注入安全性问题。
添加回答
举报