目标类:
package proxy;
/**
* Created by
*
* @date 2017-03-28 11:54.
*/
public class TargetClass{
public void printA() {
System.out.println("print A");
}
public void printB() {
System.out.println("print B");
}
}
代理的实现:
package proxy;
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 CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz) {
//设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("前置代理");
//通过代理类调用父类中的方法
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("后置代理");
return result;
}
}
测试类:
package proxy;
import net.sf.cglib.proxy.Enhancer;
/**
* Created by
*
* @date 2017-03-30 10:39.
*/
public class CglibTest {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
TargetClass targetClass = (TargetClass) proxy.getProxy(TargetClass.class);
targetClass.printB();
}
}
运行结果:
前置代理
print B
后置代理
cglib的实现原理:
cglib会根据现有的目标类,生成该目标类的子类,子类中会覆写父类中的方法,然后子类中的方法会通过反射回调CglibProxy类中的intercept方法。