-1

我一直在探索在 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 类加载器是否已经缓存了生成的类文件。最好的方法应该是什么?

此外,预计脚本并不简单,那么在 Groovy Shell 或 Groovy 类加载器中哪种机制会更好?(另外,探索 GrooyScriptEngine,但似乎简单脚本不需要它)。

4

1 回答 1

0

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

于 2019-02-05T01:17:33.287 回答