我正在编写一个用于在groovy中表达流程(我知道原创)的DSL。我想为用户提供编写在流程中某些点存储和评估的函数的能力。类似的东西:
states {
"checkedState" {
onEnter {state->
//do some groovy things with state object
}
}
}
现在,我很确定我可以在引号中包围闭包并存储它。但是,如果可能的话,我希望在编辑这些DSL时保持语法高亮和内容辅助。我意识到封闭COULD引用了周围流定义中的工件,这些工件在不同的上下文中执行闭包时将不再有效,我对此很好。实际上,我想将闭包语法用于非闭包函数定义。
TL;博士;我需要在评估DSL时获取闭包的代码,以便它可以存储在数据库中,稍后由脚本主机执行。
答案 0 :(得分:2)
我认为没有办法获取闭包的源代码,因为在编译期间会丢弃此信息。也许您可以尝试编写一个AST transformation来使闭包的语法树在运行时可用。
如果您只关心将闭包存储在数据库中,并且以后不需要访问源代码,则可以尝试对其进行序列化并存储序列化表单。
Closure
实现Serializable
,在将其owner
,thisObject
和delegate
属性归零后,我能够对其进行序列化,但我得到{关于反序列化的{1}}。
ClassNotFoundException
经过一番搜索,我找到了Groovy Remote Control,这是一个专门创建的库,可以在远程机器上启用序列化闭包并稍后执行它们。试一试,也许这就是你需要的。