gpt4 book ai didi

groovy - 对 Groovy MOP 中的 invokeMethod 方法感到困惑

转载 作者:行者123 更新时间:2023-12-04 23:52:23 25 4
gpt4 key购买 nike

首先看下面的Groovy代码:

class Car {

def check() { System.out.println "check called..." }

def start() { System.out.println "start called..." }

}

Car.metaClass.invokeMethod = { String name, args ->

System.out.print("Call to $name intercepted... ")

if (name != 'check') {
System.out.print("running filter... ")
Car.metaClass.getMetaMethod('check').invoke(delegate, null)
}

def validMethod = Car.metaClass.getMetaMethod(name, args)
if (validMethod != null) {
validMethod.invoke(delegate, args)
} else {
Car.metaClass.invokeMissingMethod(delegate, name, args)
}
}

car = new Car()
car.start()

输出是:

Call to start intercepted... running filter... check called...
start called...

根据Groovy的方法调度机制,我认为应该直接调用Car中的start方法,而不是被Car的metaClass中的invokeMethod拦截。为什么start方法会被invokeMethod拦截?在对象上调用方法时如何调用invokeMethod?

如果您能给我一些关于 Groovy 方法调度机制 (MOP) 的详细解释,我将不胜感激。

最佳答案

简而言之,您没有使用标准的元类,因此您没有获得标准的 Groovy MOP。

Car.metaClass.invokeMethod = { 会让 Car 有一个 ExpandoMetaClass 作为元类。这个元类使用你作为 open block (就像你一样)提供的 invokeMethod 来拦截调用。这与在类本身中定义 invokeMethod 非常不同。

关于groovy - 对 Groovy MOP 中的 invokeMethod 方法感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30836558/

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