我想解析一个时髦的DSL,给叶子脱水脱水,通过网络发送它并在接收端重新水合。
所以给出了这个示例DSL sniplet:
something {
title 'hello'
code {
println 'hello ${world}!'
}
}
我正在使用GroovyShell解析sniplet并提取传递给code()的闭包:
{
println 'hello ${world}!'
}
现在我想通过网络发送脱水封闭物,并使用提供属性world
作为拥有者的对象在接收端重新水化它。目的是运行闭包,并在服务器进程中查看正在打印的消息。
我得到了byte[]
代表接收过程中序列化的脱水Closure
实例,但使用ObjectInputStream
对其进行反序列化失败并显示ClassNotFoundException
对于具体的Closure
子类(命名为script1$_run_closure1$_closure2$_closure11$_closure113$_closure120$_closure128$_closure129
)。
所以我有想法也转移关闭'类定义(同样,作为byte[]
)并使用来自commons-io的ClassLoaderObjectInputStream
以及使用类ClassLoader
并使用{{1}的简单byte[]
为类defineClass()
创建Class
对象。
不幸的是我被困在这里,无法找到一种方法来将groovy闭包子类(script1$_run_closure1$_closure2$_closure11$_closure113$_closure120$_closure128$_closure129
)的类定义转换为script1$_run_closure1$...
。有没有办法实现这个目标?我已经挖掘了谷歌和byte[]
来源,但它似乎不可能。请证明我错了!