Reflection 带有嵌入式Groovy脚本的Groovy DSL

Reflection 带有嵌入式Groovy脚本的Groovy DSL,reflection,groovy,dsl,Reflection,Groovy,Dsl,我正在编写一个DSL,用于在groovy中表达流(我知道是原创的)。我希望为用户提供编写函数的能力,这些函数在流中的某些点存储和计算。比如: states { "checkedState" { onEnter {state-> //do some groovy things with state object } } } 现在,我很确定我可以用引号括住闭包并存储它。但我希望在编辑这些DSL时,尽可能保持语法突出显示和内

我正在编写一个DSL,用于在groovy中表达流(我知道是原创的)。我希望为用户提供编写函数的能力,这些函数在流中的某些点存储和计算。比如:

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渲染库,这个答案将获胜,但我会给它多一点时间让其他人回答。