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 Category
。 use
函数可以被认为是一种临时向类添加功能的方法,因此在 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 - 使方法全局可用和元类编程的主要内容,如果未能解决你的问题,请参考以下文章