假设我在Scala中有以下内容
object Foo {
var functions: List[String => String] = Nil // can be any type to any type.
def addFunc(f:String => String) = functions = f :: functions
}
在运行时,我被赋予Foo
并添加了一些功能。我现在想要构建一个新的.class文件,在Scala中实现类似跟随的内容:
object MyObject {
def process1(s:String) = // call Foo.functions(1)
}
然后我想将MyObject
保存在字节码中,即使Foo
不存在,也可以在以后执行。
上面只是一个展示我想要做的事情的例子。我被赋予了MyObject
,process1
的名称,我必须生成一个可执行文件MyObject.class
。不需要MyObject
的来源(它可能是Java源代码)。
因此,在高层次上,我们需要获取Foo.function(1)
的内存“快照”,将该快照转换为字节码进行存储,并使用此生成MyObject
的字节码。
我发现的所有字节码工程库都太低级了,所以我想知道是否有更高级别的库可以让我处理抽象对象,如函数等。
答案 0 :(得分:6)
你看过ASM的树模型吗?我之前只使用过Event模型,但树听起来就像你正在寻找的那样。您可以在ASM user guide的1.2.2节中找到概述(PDF - 我认为没有HTML版本,或者我会将其链接)。
答案 1 :(得分:0)
我还会推荐ASM框架。 AOSD'07有一篇关于用ASM实施common bytecode transformation patterns的论文。 “将两个类合并为一个”和“内联方法”这一部分描述了非常接近你的字节码转换。