如何在Java 5和Java 6中从任意字符串(在内存中)编译Java代码,加载它并在其上运行特定方法(预定义)?
在你点燃之前,我查看了现有的实现:
我确信之前已经解决了这个问题,但我找不到任何在谷歌上看起来甚至达到半生产质量的东西(除了jci,正如我之前所说的,我没有设法使用它)。
编辑:
Edit2:现在,我满足于BeanShell“评估”。显然,它做了我所需要的一切(获得一个字符串,并在'当前'类路径中对其进行评估。它确实遗漏了Java 5的一些特性,但它可以使用枚举(不定义)和编译'generic' )类,所以它应该足够我想要的。
发布于 2018-03-05 13:33:03
如果你不是完全依赖于编译,像Beanshell,groovy和其他脚本语言的解决方案很容易嵌入(事实上,Java内置支持插入脚本语言,所以你的代码甚至不知道什么语言该脚本被写入)
Beanshell应该运行任何100%的Java代码IIRC,我相信Groovy可以运行大多数Java代码 - 可能都是。
发布于 2018-03-05 14:46:44
JCI看起来不错。这段代码应该是你的基础:
JavaCompiler compiler = new JavaCompilerFactory().createCompiler("eclipse");
MemoryResourceReader mrr = new MemoryResourceReader();
mrr.add("resource name string", yourJavaSourceString.getBytes());
MemoryResourceStore mrs = new MemoryResourceStore();
CompilationResult result = compiler.compile(sources, mrr, mrs);
// don't need the result, unless you care for errors/warnings
// the class should have been compiled to your destination dir
添加一个MemoryResourceStore
将编译后的类输出发送到内存,就像请求。
此外,设置javac
你的情况设置,如类路径,可以通过完成setCustomArguments(String[] pCustomArguments)
在JavacJavaCompilerSettings
类。
https://stackoverflow.com/questions/-100007511
复制相似问题