需求:
对指定类的方法做代理。
可以使用Proxy+InvocationHandler实现,但是如果代理类没有父接口的情况下,如何快速实现?
spring的cglib下提供的Enhancer可以快速实现对某个类的所有实例方法(除final)进行代理。
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyHandler.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
System.out.println(">>>>>>>" + method.getName());
//注意此处调用的invokeSuper
Object invoke = methodProxy.invokeSuper(o, objects);
System.out.println("after");
return invoke;
}
});
MyHandler handler = (MyHandler) enhancer.create();
handler.method();
handler.finalMethod();//没有代理
handler.protectMethod();
MyHandler.staticMethod();//没有代理
}
public class MyHandler {
public String method(){
System.out.println("hello Enhancer");
return "2";
}
public final String finalMethod(){
System.out.println("hello finalMethod");
return "3";
}
public static String staticMethod(){
System.out.println("hello staticMethod");
return "4";
}
protected String protectMethod(){
System.out.println("hello protectMethod");
return "5";
}
}
总的来说比较方便就实现了对方法的代理
本文介绍如何使用Spring的CGLIB库中的Enhancer类来实现代理模式,特别是针对没有父接口的类。通过创建Enhancer实例并设置回调,可以拦截目标类的方法调用,实现对方法的增强。
2750

被折叠的 条评论
为什么被折叠?



