gpt4 book ai didi

groovy - 在类级别应用类别

转载 作者:行者123 更新时间:2023-12-01 06:27:53 24 4
gpt4 key购买 nike

如果我想在一小段代码中使用 Groovy 类别,我通常会这样做

def foo() {

use(TimeCategory) {
new Date() + 5.hours
}
}

但是,如果我想在同一个类的多个方法中使用一个类别,则必须重复调用 use 很乏味。在每种方法中。

有没有办法在类级别应用类别?我尝试使用 Groovy 的 @Mixin像这样注释:
import groovy.time.*

@Mixin(TimeCategory)
class Foo {

Foo() {
new Date() + 5.hours
}
}

new Foo()

但是如果你在 Groovy 控制台中执行上面的代码,你会得到一个异常:

groovy.lang.MissingPropertyException: No such property: hour for class: java.lang.Integer

最佳答案

您可以使用 MetaClass.invokeMethod()事后。这有点难看,但它保持类代码相对干净:

import groovy.time.*

class Foo {
Foo() {
try { println (new Date() + 5.hours) }
catch (e) { println e }

try { println afterHours(5) }
catch (e) { println e }
}

Date tomorrow() {
new Date() + 1.days
}

Date nextWeek() {
new Date() + 7.days
}

Date afterHours(int h) {
new Date() + h.hours
}
}

解决方案#1:修改 Foo.metaClass下游某处如下:
Foo.metaClass.invokeMethod = { String name, args ->
def metaMethod = Foo.metaClass.getMetaMethod(name, args)
def result
use(TimeCategory) {
result = metaMethod.invoke(delegate.delegate, args)
}
return result
}

测试如下:
def foo = new Foo()
println "tomorrow: ${foo.tomorrow()}"
println "next week: ${foo.nextWeek()}"
println "after 7 hours: ${foo.afterHours(7)} "

产生以下结果
groovy.lang.MissingPropertyException: No such property: hours for class: java.lang.Integer
groovy.lang.MissingPropertyException: No such property: hours for class: java.lang.Integer
tomorrow: Fri Oct 17 14:46:52 CDT 2014
next week: Thu Oct 23 14:46:52 CDT 2014
after 7 hours: Thu Oct 16 21:46:52 CDT 2014

所以它在构造函数中或通过构造函数不起作用,但它在其他任何地方都起作用。

如果您不介意全局更改 Integer 和 Date 的行为,则可以改用以下解决方案。

解决方案#2:

与之前相同的类,而不是修改 Foo.metaClass , 修改 Integer.metaclassDate.metaClass如下:
Integer.metaClass.mixin TimeCategory
Date.metaClass.mixin TimeCategory

现在与之前相同的测试产生以下输出:
Thu Oct 16 21:19:24 CDT 2014
Thu Oct 16 21:19:24 CDT 2014
tomorrow: Fri Oct 17 16:19:24 CDT 2014
next week: Thu Oct 23 16:19:24 CDT 2014
after 7 hours: Thu Oct 16 23:19:24 CDT 2014

关于groovy - 在类级别应用类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26240349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com