反射 – Groovy:在调用任何方法之前和之后,执行代码是透明的
假设我们有一个带有一些方法(静态或非静态)的groovy类.
我想要做的是在调用此类的每个方法之前和之后执行一些代码,而根本不需要触及类,也不需要动态操作每个方法内部的代码. 我尝试使用groovy metaClass;获取metaClass的所有方法,然后使用包装方法动态替换every方法,包含一些代码,并在中间调用旧方法.问题是,我不知道每个原始方法的参数,所以我不能用新方法(闭包)替换旧方法,因为我不能动态地创建具有不同数量和类型的参数的包装闭包,即使yi可以,我不知道如何在包装封口内访问它们.我需要包装闭包具有与旧方法相同的签名,以便在有人在透明地更改类之后尝试调用旧方法时调用闭包. 在Javascript中,例如我可以使用args []数组访问函数体中的所有参数,即使我在编写代码时不知道参数名称. 我怎么能在groovy做到这一点?或者他们可能是另一种方式来实现我的目标? 解决方法
像下面的东西会做什么?使用invokeMethod拦截对每个方法的调用.测试是自我解释的.
说明: 下面的metaClass实现从 注意:- >确保从闭包中返回方法调用的返回值 执行: class Dummy { def method1() { System.out.println "In method 1" } def method2(String str) { System.out.println "In method 2" } static def method3(int a,int b) { System.out.println "In static method 3" } } Dummy.metaClass.invokeMethod = {String name,args -> def result System.out.println( "Do something before $name is called with args $args") try { result = delegate.metaClass.getMetaMethod(name,args) .invoke(delegate,args) } catch(Exception e) { System.out.println "Handling exception for method $name" } System.out.println( "Do something after $name was called with args $args n") result } Dummy.metaClass.'static'.invokeMethod = {String name,args -> def result System.out.println( "Do something before static method $name is called with args $args") try { result = delegate.metaClass.getMetaMethod(name,args) } catch(Exception e) { System.out.println "Handling exception for method $name" } System.out.println( "Do something after static method $name was called with args $args n") result } def dummy = new Dummy() dummy.method1() dummy.method2('Test') Dummy.method3(1,2) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |