【问题标题】:using groovy binding along with groovyclassloader使用 groovy 绑定和 groovyclassloader
【发布时间】:2016-02-15 10:37:15
【问题描述】:

我正在阅读 http://www.slideshare.net/glaforge/going-to-mars-with-groovy-domainspecific-languages/46-How_to_inject_the_direction,因为在我们最近继承的代码库上做了类似的事情。问题是我们继承的代码使用来自 java 应用程序的 groovy,并使用 GroovyClassLoader 加载然后实例化/调用 groovy 脚本。我想知道,是否有任何方法可以通过 groovyclassloader 的方法使用 groovy 绑定。或者有没有更合适的方法? (扩展元类?)

【问题讨论】:

    标签: java groovy


    【解决方案1】:

    GroovyClassLoader 创建覆盖 groovy.lang.Script 的类。

    在类 Script 上,您有一个 setBinding 方法,该方法与您的演示文稿中的 Binding 相同。在拨打run()之前先拨打setBinding()

    【讨论】:

    • 代码执行以下操作。 1) 使用 groovy 类加载器创建一个新类。 2) 使用 Class.newInstance 创建一个实例,3) 使用 instance.invokeMethod 执行该方法。当我将实例转换为脚本时,我得到一个类转换异常。
    • 发布您的代码和您加载的文件的示例,但如果您不加载脚本,则不能使用绑定
    • groovy 代码本身是使用一些非常复杂的字符串操作生成的。生成代码的模板似乎表明一个是“class XXX {.....}”,另一个是“class YYY extends XXX {....}”。然后将整个字符串传递给 groovyclassloader.parseClass()。所以,看起来像怀疑的那样,不能使用Binding。有其他解决方案吗?
    • Binding 的目的是将“上下文”(默认属性或方法)注入脚本。如果你正在生成你的类,你不能使用绑定,但你不需要它:用你的模板生成你需要的存根
    • 感谢您的回复。生成类的代码是非常通用的东西。我想知道我们是否可以使用 HandleMetaClass 来注入每个实例的元类并添加一个属性。你知道这是否存在性能或并发问题?
    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2011-03-15
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多