我有一个应用程序,它可以运行脚本来自动化某些任务。我希望在这些脚本中使用元编程来优化代码大小和可读性。因此,与其:
try {
def res = factory.allocate();
... do something with res ...
} finally {
res.close()
}我想
Factory.metaClass.withResource = { c ->
try {
def res = factory.allocate();
c(res)
} finally {
res.close()
}
}所以脚本作者可以写:
factory.withResource { res ->
... do something with res ...
}(我可以做正确的错误处理,等等)。
现在,我想知道我何时以及如何实现这一点。我可以将元类的操作附加到头中,我将其添加到每个脚本中,但我担心如果两个用户同时运行脚本(并发访问元类)会发生什么。
元类的范围是什么?编译器?剧本环境?Java?加载Groovy的类加载器?
我的推理是,如果Groovy元类有VM作用域,那么我可以在启动期间运行一次安装脚本。
发布于 2014-09-22 15:31:29
这类事情的另一种选择是使用扩展模块,这对于很多场景来说都更好。
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的文件,其中包含以下内容.
moduleName=factory-extension-module
moduleVersion=1.0
extensionClasses=demo.FactoryExtension然后,为了让别人使用您的扩展名,他们只需将jar文件放在CLASSPATH上即可。有了所有这些,用户就可以做这样的事情.
factoryInstance.withResource { res ->
... do something with res ...
}有关扩展模块的更多信息可在modules上获得。
https://stackoverflow.com/questions/25974525
复制相似问题