Groovy 元类的范围?

2023-12-27

我有一个可以运行脚本来自动执行某些任务的应用程序。我想在这些脚本中使用元编程来优化代码大小和可读性。所以而不是:

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 范围,那么我可以在启动期间运行一次安装脚本。


Metaclasses exist per classloader [citation needed]:

File /tmp/Qwop.groovy:

class Qwop { }

File /tmp/Loader.groovy:

Qwop.metaClass.bar = { }
qwop1 = new Qwop()
assert qwop1.respondsTo('bar')

loader = new GroovyClassLoader()
clazz = loader.parseClass new File("/tmp/Qwop.groovy")

clazz.metaClass.brap = { 'oh my' }

qwop = clazz.newInstance()

assert !qwop.respondsTo('bar')
assert qwop1.respondsTo('bar')

assert qwop.brap() == "oh my"
assert !qwop1.respondsTo('brap')

// here be custom classloaders
new GroovyShell(loader).evaluate new File('/tmp/QwopTest.groovy')

以及一个测试作用域元类的脚本(/tmp/QwopTest.groovy):

assert !new Qwop().respondsTo('bar')
assert new Qwop().respondsTo('brap')

执行:

$ groovy Loaders.groovy 
$ 

如果您有一组定义良好的类,您可以在这些类之上应用元编程由你的类加载器加载,根据brap方法已添加。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Groovy 元类的范围? 的相关文章

随机推荐

  • Google Maps SDK 中的自定义注释视图

    我创建了一个基于地图的 iOS 应用程序 其中我想使用 iOS 版 Google Maps SDK 而不是 Mapkit 我找到了文档 但没有找到与自定义注释视图相关的方法 任何人都可以为我提供解决方案创建自定义注释视图 信息窗口 以及如何
  • 在数学模式下将变量写为下标

    我正在尝试绘制一些数据 使用 for 循环来绘制分布 现在我想根据循环计数器将这些分布标记为数学符号中的下标 这就是我现在的处境 import matplotlib pyplot as plt import numpy as np impo
  • ASP.NET MVC 使用 UIHint 属性生成 DropDownList

    我想知道如何使用 UIHint 属性生成 DropDownList 我已经自定义了一些预定义属性 但我不知道如何继续生成 DropDownList 这是我对上一个的处理方式 我想以类似的方式使用它 public class CartProd
  • 使用 apache 检查请求中是否存在标头

    如何检查标头是否存在 我不想检查该值是否与 不同 我想使用以下方法检查它是否确实存在 重写条件 我怎样才能在 htaccess 文件中做到这一点 anhubhava 的回答很有用 但逻辑 颠倒了 它应该是 RewriteEngine On
  • Selenium 使用 javascript 获取元素的类属性

    我正在使用 Selenium 用 Ja vascript 编写测试自动化 尝试提取 DOM 元素的类属性对我来说不起作用 这是我的代码 var webdriver require selenium webdriver var driver
  • Java中的顶级类是什么?

    Java中的顶级类是什么 Java中顶级类的定义是什么 我知道这是一个基本问题 但我找不到这个问题的明确而简单的答案 它只是任何不是嵌套类的类 如果您的文件是 Foo java 并且您的类是 Foo 那么它是顶级类 in Foo java
  • iOS:popViewController 意外行为

    我一直在互联网上寻找解决方案 我什么也找不到 所以 我正在使用 UINavigationController 我将两个 UIViewController 推到上面 在第二个推送的 ViewController 中 我正在执行以下代码 voi
  • 在 iOS 6 中,UIViewController 是否可以支持比其父级更多的界面方向?

    iOS 6 中自动旋转的变化似乎让这变得异常困难 或者说不可能 他们似乎在推行这样的理念 子视图控制器不应覆盖其父视图控制器的自动旋转行为 这使得很难完成我想做的事情 我有一个必须纵向显示的视图控制器 它以模态方式推动另一个视图控制器 它是
  • 上下文切换死锁

    在 VS 2008 中调试我的程序时 我遇到了以下错误 CLR 在 60 秒内无法从 COM 上下文 0x34fc1a0 转换到 COM 上下文 0x34fc258 拥有目标上下文 单元的线程很可能执行非泵送等待或处理非常长时间运行的操作而
  • 将原子 int 向量转换或转换为 int 向量的有效方法

    我确实有一个整数向量 我想确保增量操作发生线程安全 所以我使用std vector
  • 计时器不定期更新并“跳过”一秒(Silverlight 4 DispatcherTimer)

    对于以下问题 我希望得到一些帮助 您可以在我的网站上看到这个问题现场扑克百叶窗计时器 http www pokerdiy com poker blinds timer aspx 主时钟 盲定时器倒计时 从 20 00 开始 然后跳转到 19
  • 自定义 UINavigationController UIToolbar 背景图片

    我有一个 iPhone 应用程序使用UINavigationController并希望使用自定义背景图像自定义元素 我能够为UINavigationController s UINavigationBar使用 Objective C 类别很
  • Android 推送通知

    我参考了链接a link http www vogella de code de vogella android c2dm codestartpage html开发推送通知 但在运行时向我显示 UI main xml 我应该如何创建推送通知
  • 单击时选项菜单不会显示第一个选项(Tkinter)

    我添加了一个OptionMenu小部件到我的代码 并分配一个列表作为它的选项 事情是这样的 z StringVar z set userList 0 usersOption OptionMenu frame1 z userList comm
  • head() 函数在“for”循环中不起作用?

    我尝试使用 for 循环打印出几行 这是代码 奇怪的是它不适用于 head 函数 如果我更换它就可以了head with print kw id c a b keyword text data frame col c a b col2 c
  • 为什么 TFS 忽略我的解决方案中的项目?

    我的解决方案中有多个项目位于 TFS 2010 存储库中 最近几天 我向此解决方案添加了大约 5 个新项目 我发现对于其中一个项目 项目文件本身不会签入 TFS 该项目中包含的所有工件都工作正常 他们已签入 我可以在团队资源管理器中看到他们
  • 错误代码 220 - 尝试转发时“您的凭据不允许访问此资源”

    当我试图得到https api twitter com 1 1 statuses retweets 21947795900469248 json https api twitter com 1 1 statuses retweets 219
  • 我可以在 iOS 7 上手动提示用户登录 Game Center 吗?

    根据 Apple 的 Game Center 编程指南 此代码设置了一个身份验证处理程序 如果您在游戏开始时运行此命令 第一次运行它时 如果用户尚未登录 它将提示用户登录 void authenticateLocalPlayer GKLoc
  • 如何跟踪对象的引用?

    在手动内存分配和指针仍然占主导地位的世界中 Borland Delphi 我需要一个通用的解决方案来解决我认为的普遍问题 在给定时刻 可以从多个位置 列表 其他对象 引用一个对象 有没有一种好方法来跟踪所有这些引用 以便我可以在对象被销毁时
  • Groovy 元类的范围?

    我有一个可以运行脚本来自动执行某些任务的应用程序 我想在这些脚本中使用元编程来优化代码大小和可读性 所以而不是 try def res factory allocate do something with res finally res c