Reflection 带有嵌入式Groovy脚本的Groovy DSL
我正在编写一个DSL,用于在groovy中表达流(我知道是原创的)。我希望为用户提供编写函数的能力,这些函数在流中的某些点存储和计算。比如:Reflection 带有嵌入式Groovy脚本的Groovy DSL,reflection,groovy,dsl,Reflection,Groovy,Dsl,我正在编写一个DSL,用于在groovy中表达流(我知道是原创的)。我希望为用户提供编写函数的能力,这些函数在流中的某些点存储和计算。比如: states { "checkedState" { onEnter {state-> //do some groovy things with state object } } } 现在,我很确定我可以用引号括住闭包并存储它。但我希望在编辑这些DSL时,尽可能保持语法突出显示和内
states {
"checkedState" {
onEnter {state->
//do some groovy things with state object
}
}
}
现在,我很确定我可以用引号括住闭包并存储它。但我希望在编辑这些DSL时,尽可能保持语法突出显示和内容辅助。我意识到闭包可以引用来自周围流定义的工件,当在不同的上下文中执行闭包时,这些工件将不再有效,对此我很满意。实际上,我想对非闭包函数定义使用闭包语法
tl;博士我需要在评估DSL时获取闭包的代码,以便它可以存储在数据库中,稍后由脚本主机执行。我认为没有办法获取闭包的源代码,因为在编译过程中会丢弃这些信息。也许您可以尝试编写一个函数,使闭包的语法树在运行时可用 如果您只关心将闭包存储在数据库中,而不需要以后访问源代码,那么可以尝试序列化它并存储序列化的表单
Closure
实现了Serializable
,在将其所有者
置零后,this对象
和委托
属性我能够对其进行序列化,但在反序列化时我得到了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
经过一些搜索,我发现,创建了一个库,专门用于序列化闭包并在以后可能在远程计算机上执行它们。试试看,也许这就是你需要的。回答得好,谢谢!如果没有一个预先构建的AST渲染库,这个答案将获胜,但我会给它多一点时间让其他人回答。