我正在用groovy编写一个用于表示流的DSL(我知道最初的流)。我希望为用户提供编写在流中的某些点存储和评估的函数的能力。比如:
states {
"checkedState" {
onEnter {state->
//do some groovy things with state object
}
}
}
现在,我很确定我可以用引号包围闭包并存储它。但是,如果可能的话,我希望在编辑这些dsl时保持语法突出显示和内容辅助。我意识到闭包可以引用周围流定义中的工件,当在不同的上下文中执行闭包时,这些工件将不再有效,我对此很满意。实际上,我更愿意在非闭包函数定义中使用闭包语法。
tl,博士;我需要获得闭包的代码,同时评估DSL,以便它可以存储在数据库中,并由脚本主机稍后执行。
我认为没有办法获得闭包的源代码,因为这些信息在编译过程中被丢弃。也许你可以尝试编写一个AST转换,使闭包的语法树在运行时可用。
如果您只关心在数据库中存储闭包,并且以后不需要访问源代码,则可以尝试将其序列化并存储序列化的形式。
Closure
实现了Serializable
,在取消其owner
, thisObject
和delegate
属性后,我能够序列化它,但在反序列化时我得到了ClassNotFoundException
。
def myClosure = {a, b -> a + b}
Closure.metaClass.setAttribute(myClosure, "owner", null)
Closure.metaClass.setAttribute(myClosure, "thisObject", null)
myClosure.delegate = null
def byteOS = new ByteArrayOutputStream()
new ObjectOutputStream(byteOS).writeObject(myClosure)
def serializedClosure = byteOS.toByteArray()
def input = new ObjectInputStream(new ByteArrayInputStream(serializedClosure))
def deserializedClosure = input.readObject() // throws CNFE
经过一番搜索,我找到了Groovy Remote Control,这是一个专门用于序列化闭包并在以后(可能在远程机器上)执行它们的库。试一试,也许这就是你需要的。