假设我们有一个带有一些方法(静态或非静态)的groovy类 . 我想要做的是在调用此类的每个方法之前和之后执行一些代码,而根本不需要触及类,也不需要动态操作每个方法内部的代码 .
我尝试使用groovy metaClass;获取metaClass的所有方法,然后使用包装方法动态替换every方法,包含一些代码,并在中间调用旧方法 . 问题是,我不知道每个原始方法的参数,所以我不能用新方法(闭包)替换旧方法,因为我不能动态地创建具有不同数量和类型的参数的包装闭包,即使yi可以,我不知道如何在包装封口内访问它们 . 我需要包装闭包具有与旧方法相同的签名,以便在有人在透明地更改类之后尝试调用旧方法时调用闭包 .
在Javascript中,例如我可以使用args []数组访问函数体中的所有参数,即使我在编写代码时不知道参数名称 .
我怎么能在groovy做到这一点?或者他们可能是另一种方式来实现我的目标?
1 回答
像下面的东西会做什么?使用
invokeMethod
拦截对每个方法的调用 . 测试是自我解释的 .Explanation:
下面的metaClass实现覆盖了来自GroovyObject的invokeMethod . 由于所有groovy对象都继承自GroovyObject,因此我们可以灵活地操作/拦截方法调用,甚至可以指定我们自己的
methodMissing
实现 . 我们需要一个覆盖静态方法和一个非静态方法 . 基本上,invokeMethod拦截对定义它的Class上的每个方法的调用 . 我们最终为每种方法提供了一些before
和after
功能 . 使用反射,下面的实现能够通过其名称和参数找出方法,并在运行时调用它 .Note:-
确保从闭包中返回方法调用的返回值
可能是一个昂贵的类有很多方法与繁重的实现
如果需要选择性执行,则检查方法名称,然后拦截该呼叫
Implementation: