我在用cglib实现动态代理功能时,发现无法拦截静态方法,而是直接调用的静态方法。追踪了一下源码,发现把静态方法过滤掉了,没做拦截。代理模式中的真实角色和代理角色都继承或实现一个抽象类或接口,甚至普通的类也行,都是代理模式的大致意思,代理角色中传入真实角色实例后,在调用真实方法前后或做处理。那么,既然抽象出来的那“哥们”,可以是类,比如cglib中就是利用继承,对pojo进行动态字节码生成其子类,即生成的代理角色,但是不代理static普通方法,而我自己写一个靠继承实现的代理的话,显然能实现,即重写抽象出的类的static普通方法。想问问,为什么会这样,为什么要这样?恳请各位解答,不甚感激!下面是做的例子,比较了static和非static方法被拦截的情况。真实对象publicclassTargetObject{publicstaticvoidbusinessLogic(){System.out.println("目标对象/真实对象中的业务逻辑处理");}}具体代理控制逻辑,实现MethodInterceptor接口publicclassAroundAdviceimplementsMethodInterceptor{/**重写方法**@seenet.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object,*java.lang.reflect.Method,java.lang.Object[],*net.sf.cglib.proxy.MethodProxy)*//***Parameters:obj-"this",theenhancedobject**method-interceptedMethodargs-argumentarray;primitivetypesare*wrapped**proxy-usedtoinvokesuper(non-interceptedmethod);maybecalledas*manytimesasneeded**Returns:anyvaluecompatiblewiththesignatureoftheproxiedmethod.*Methodreturningvoidwillignorethisvalue.*/@OverridepublicObjectintercept(Objecttarget,Methodmethod,Object[]arg2,MethodProxymethodProxy)throwsThrowable{System.out.println("目标对象/真实对象方法调用之前...");Objectresult=methodProxy.invokeSuper(target,arg2);System.out.println("目标对象/真实对象方法调用之后...");returnresult+"<--真实对象的返回值。\"通知\"中的新加内容";}}生成代理对象的工具类publicclassProxyUtil{publicstaticTargetObjectgetProxy(){//增强处理器:拦截的方法插入代理控制逻辑的处理器Enhancerenhancer=newEnhancer();//设置要代理的目标类enhancer.setSuperclass(TargetObject.class);//设置要代理的拦截器enhancer.setCallback(newAroundAdvice());//生成并返回代理对象return(TargetObject)enhancer.create();}}测试类publicclassTest{publicstaticvoidmain(String[]args){TargetObjecttargetObject=ProxyUtil.getProxy();targetObject.businessLogic();}}TargetObject中的方法为static修饰时,打印:目标对象/真实对象中的业务逻辑处理去掉static,打印:目标对象/真实对象方法调用之前...目标对象/真实对象中的业务逻辑处理目标对象/真实对象方法调用之后...
相关分类