【问题标题】:Grails - Making Methods Globally Available and Metaclass ProgrammingGrails - 使方法全局可用和元类编程
【发布时间】: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,它也应该从那里导入。

标签: grails groovy metaprogramming metaclass


【解决方案1】:

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

使用DelegatingMetaClass

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

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

【讨论】:

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