cglib实现的代理为被代理类的子类,当调用代理类方法的时候,会根据设置的回调类,执行里面的拦截的方法。
被代理的类:
package com.xhx.java;
public class Hello {
public void say(){
System.out.println("hello world");
}
}
首先创建代理类:用Enhancer,设置被代理的类和回调的方法。
package com.xhx.java;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
public class ProxyBuilder {
public static Object getHelloProxy(Class clazz, Callback callback) {
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(clazz);
//设置回调类 拦截方法 MethodInterceptor的 intercept方法
enhancer.setCallback(callback);
//生成代理对象
return enhancer.create();
}
}
回调方法的拦截器,继承MethodInterceptor
package com.xhx.java;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class HelloProxy implements MethodInterceptor {
/**
* 接口的回调方法
* @param o cglib生成的代理对象
* @param method 被代理的方法
* @param objects 方法入参
* @param methodProxy 代理方法
* @return
* @throws Throwable
*/
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("前");
System.out.println(method.toString());
System.out.println(methodProxy.toString());
System.out.println(o.getClass().toString());
Object result = methodProxy.invokeSuper(o, objects);
//这种方法相当于一直调用代理类的方法,就会一直回调,造成死循环
//Object rest = methodProxy.invoke(o,objects);
System.out.println("后");
return result;
}
/**
前
public void com.xhx.java.Hello.say()
net.sf.cglib.proxy.MethodProxy@4667ae56
class com.xhx.java.Hello$$EnhancerByCGLIB$$d156e917
hello world
后
*/
}
测试:
package com.xhx.java;
public class App {
public static void main(String[] args) {
Hello hello = (Hello)ProxyBuilder.getHelloProxy(Hello.class, new HelloProxy());
hello.say();
}
}
**实时内容请关注微信公众号,公众号与博客同时更新:程序员星星**