在Java应用程序中运行和优化Groovy脚本动态执行

时间:2019-02-02 02:00:40

标签: java groovy cassandra groovyshell groovyclassloader

我一直在探索在Java应用程序中动态运行groovy脚本的方法。

我经历过类似的方法: 1. Groovy Shell

binding.setVariable("x", 5);
String script = "y = x * x"
GroovyShell gs = new GroovyShell();
Script script = gs.parse(script);
script.run();
  1. 使用GroovyClassLoader。

我有两个Java应用程序。其中之一是用于在执行数据时存储数据的GUI的后端。两者之间没有通用的缓存。 为了避免每次编译的开销,我正在考虑先在应用程序B中编译应用程序,然后对其进行缓存(这样也可以避免内存泄漏)。另外,我尝试存储最初通过编译脚本然后将其以字节形式存储在数据库中而生成的类文件,但是到目前为止还没有成功。

但是,我不确定这是否是一种优化,还是不确定Groovy Shell / Groovy Class Loader是否已经缓存了生成的类文件。 最好的方法是什么?

此外,脚本不是很简单,因此哪种机制在Groovy Shell或Groovy Class Loader中会更好? (此外,探索GrooyScriptEngine,但似乎对于简单的脚本并不需要它。)

1 个答案:

答案 0 :(得分:0)

Afaik gs.parse(script)将不会缓存该编译。因此缓存脚本会有所帮助,因为这样您就不必每次都为编译付费。如果您真的想将字节码写入数据库,那么我建议使用GroovyClassLoader(GCL)...实际上,我建议对它进行子类化并重写createCollector来提供您自己的收集器(委托给原始收集器),这允许您访问字节[]。或者使用BytecodeProcessor,您必须在提供给GCL的CompilerConfiguration中进行设置。