Ste*_*lis 11 java scala bytecode
我正在研究一种基于Scala的脚本语言(内部DSL),它允许用户在Scala脚本文件中定义多个数据转换函数.由于这些功能的应用可能需要几个小时,我想将结果缓存在数据库中.允许用户更改转换函数的定义以及添加新函数.但是,然后用户使用略微修改的脚本重新启动应用程序,我只想执行已更改或添加的那些功能.问题是如何检测这些变化?为简单起见,我们假设用户只能调整脚本文件,以便可以假定对此脚本中未定义的内容的任何引用都不会更改.
在这种情况下,检测此类用户定义函数的更改的最佳实践是什么?
到现在为止我虽然:
然而,这三种方法都存在缺陷.
有人有这些"解决方案"的经验或者可以建议我更好吗?
第二个选择看起来并不困难。例如,使用Javassist库获取方法的字节码非常简单
CtClass c = ClassPool.getDefault().get(className);
for (CtMethod m: c.getDeclaredMethod()) {
CodeAttribute ca = m.getMethodInfo().getCodeAttribute();
if (ca != null) { // i.e. if the method is not native
byte[] byteCode = ca.getCode();
...
}
}
Run Code Online (Sandbox Code Playgroud)
因此,只要您假设方法的结果仅取决于该方法的代码,那就非常简单了。
更新: 另一方面,由于您的方法是用 Scala 编写的,因此它们可能包含一些闭包,因此它们的部分代码驻留在匿名类中,并且您可能需要以某种方式跟踪这些类的使用情况。
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |