CGLIB无法拦截静态方法

我在用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.
*/
@Override
publicObjectintercept(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,打印:
目标对象/真实对象方法调用之前...
目标对象/真实对象中的业务逻辑处理
目标对象/真实对象方法调用之后...
倚天杖
浏览 701回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript