首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy的metaClass范围?

Groovy的metaClass范围?
EN

Stack Overflow用户
提问于 2014-09-22 12:46:07
回答 1查看 511关注 0票数 3

我有一个应用程序,它可以运行脚本来自动化某些任务。我希望在这些脚本中使用元编程来优化代码大小和可读性。因此,与其:

代码语言:javascript
复制
try {
    def res = factory.allocate();
    ... do something with res ...
} finally {
    res.close()
}

我想

代码语言:javascript
复制
Factory.metaClass.withResource = { c -> 
    try {
        def res = factory.allocate();
        c(res)
    } finally {
        res.close()
    }
}

所以脚本作者可以写:

代码语言:javascript
复制
factory.withResource { res ->
    ... do something with res ...
}

(我可以做正确的错误处理,等等)。

现在,我想知道我何时以及如何实现这一点。我可以将元类的操作附加到头中,我将其添加到每个脚本中,但我担心如果两个用户同时运行脚本(并发访问元类)会发生什么。

元类的范围是什么?编译器?剧本环境?Java?加载Groovy的类加载器?

我的推理是,如果Groovy元类有VM作用域,那么我可以在启动期间运行一次安装脚本。

EN

回答 1

Stack Overflow用户

发布于 2014-09-22 15:31:29

这类事情的另一种选择是使用扩展模块,这对于很多场景来说都更好。

代码语言:javascript
复制
package demo

class FactoryExtension {
    static withResource(Factory instance, Closure c) {
        def res
        try {
            res = instance.allocate()
            c(res)
        } finally {
            res?.close()
        }
    }
}

编译它,并将其放入一个jar文件中,其中包含一个位于META-INF/services/org.codehaus.groovy.runtime.ExtensionModule的文件,其中包含以下内容.

代码语言:javascript
复制
moduleName=factory-extension-module
moduleVersion=1.0
extensionClasses=demo.FactoryExtension

然后,为了让别人使用您的扩展名,他们只需将jar文件放在CLASSPATH上即可。有了所有这些,用户就可以做这样的事情.

代码语言:javascript
复制
factoryInstance.withResource { res ->
    ... do something with res ...
}

有关扩展模块的更多信息可在modules上获得。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25974525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档