Grails - 使方法全局可用和元类编程

Posted

技术标签:

【中文标题】Grails - 使方法全局可用和元类编程【英文标题】:Grails - Making Methods Globally Available and Metaclass Programming 【发布时间】:2011-09-21 04:36:48 【问题描述】:

我将这一行插入到我的 BootStrap 类的 init() 中

Integer.metaClass.minutes =  60000L * delegate 

然后我无法从 Job 类(Quartz 插件)中使用它。我是否将这行代码放在其他地方以使其成为全局修改?

我还想知道在 Grails 的所有类中使用函数的最佳方法。 就像一个全局函数。是扩展 Object 元类吗?还是有更好的方法?

【问题讨论】:

您可以使用已经存在的:def time = use( TimeCategory ) 10.minutes.toMilliseconds() ... 虽然这不能回答您的问题 ;-) 非常酷。你能解释一下 use 和 TimeCategory 的东西吗?最好的参考?很棒的评论 +1 @tyndall TimeCategory 是一个 Groovy Categoryuse 函数可以被认为是一种临时向类添加功能的方法,因此在 use() ... 块内,类别生效,整数使用基于时间的属性进行修饰。类似于向metaClass 添加方法,但更加本地化。 注意:在 groovy 1.8 中,TimeCategory 已移至 groovy.time.* 包,在 Grails 开始使用它之前不会影响到它(v1.4?) @tim_yates 实际上,TimeCategory 存在于 groovy 1.7 中的新位置。即使使用 grails 1.3,它也应该从那里导入。 【参考方案1】:

我是否将这行代码放在其他地方以使其成为全局修改?

使用DelegatingMetaClass

我还想知道在 Grails 的所有类中使用函数的最佳方法。就像一个全局函数。是扩展 Object 元类吗?还是有更好的方法?

如果你想让函数成为所有类的实例方法,那么你必须将它添加到Object的元类中(见上文)。如果没有,只需将函数添加为类的静态方法,即与在 Java 中使函数全局可访问的方式相同。

【讨论】:

在问题的第二部分,我希望为我一直需要做的事情创建一个快速拨号功能。前任。使用 GORM 根据 FacebookID 快速获取我系统中的用户。仅供参考 - jQuery $ 或 UnderscoreJS 中的“快速拨号” _ 我不想使用一个奇怪的字符,只是一个非常短的方法名称。 好的。以为我有这个工作。没有这样的运气。您将类放在 StringMetaClass 示例中的什么位置?我在文章中使用了第二种方法。在 src/groovy 中?

以上是关于Grails - 使方法全局可用和元类编程的主要内容,如果未能解决你的问题,请参考以下文章

单例类和元类

类和元类

向 Grails 中的对象添加方法并使其全局可用

鼻子,unittest.TestCase 和元类:未发现自动生成的 test_* 方法

Python基础入门自学——12--new方法和元类

在 Python 中使用 attr 模块和元类