public class CalculatorImpl implements Calculator { @Override public Integer add(Integer num1, Integer num2) { Integer result = num1 + num2; return result; }}
代理对象
public class CalculatorProxyImpl implements Calculator { private Calculator calculator; @Override public Integer add(Integer num1, Integer num2) { //方法调用前,可以添加其他功能.... Integer result = calculator.add(num1, num2); //方法调用后,可以添加其他功能.... return result; } public CalculatorProxyImpl(Calculator calculator) { this.calculator = calculator; }}
测试类
public class CalculatorProxyClient { public static void main(String[] args) { //目标对象 Calculator target = new CalculatorImpl(); //代理对象 Calculator proxy = new CalculatorProxyImpl(target); Integer result = proxy.add(1,2); System.out.println("相加结果:" + result); }}
public class CglibCalculatorImpl implements CglibCalculator { @Override public Integer add(Integer num1, Integer num2) { Integer result = num1 + num2; return result; }}
动态代理对象
public class CglibProxyFactory implements MethodInterceptor { /** * 维护一个目标对象 */ private Object target; public CglibProxyFactory(Object target) { this.target = target; } /** * 为目标对象生成代理对象 * @return */ public Object getProxyInstance() { //工具类 Enhancer en = new Enhancer(); //设置父类 en.setSuperclass(target.getClass()); //设置回调函数 en.setCallback(this); //创建子类对象代理 return en.create(); } @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("方法调用前,可以添加其他功能...."); // 执行目标对象方法 Object returnValue = method.invoke(target, args); System.out.println("方法调用后,可以添加其他功能...."); return returnValue; }}
测试类
public class TestCglibProxy { public static void main(String[] args) { //目标对象 CglibCalculator target = new CglibCalculatorImpl(); System.out.println(target.getClass()); //代理对象 CglibCalculator proxyClassObj = (CglibCalculator) new CglibProxyFactory(target).getProxyInstance(); System.out.println(proxyClassObj.getClass()); //执行代理方法 Integer result = proxyClassObj.add(1,2); System.out.println("相加结果:" + result); }}
输出结果
class com.example.java.proxy.cglib1.CglibCalculatorImplclass com.example.java.proxy.cglib1.CglibCalculatorImpl$EnhancerByCGLIB$3ceadfe4方法调用前,可以添加其他功能....方法调用后,可以添加其他功能....相加结果:3
将 cglib 生成的代理类改写为静态实现类大概长这样:
public class CglibCalculatorImplByCGLIB extends CglibCalculatorImpl implements Factory { private static final MethodInterceptor methodInterceptor; private static final Method method; public final Integer add(Integer var1, Integer var2) { return methodInterceptor.intercept(this, method, new Object[]{var1, var2}, methodProxy); } //....}
其中,拦截思路与 JDK 类似,都是通过一个接口方法进行拦截处理!
在上文中咱们还介绍到了,cglib 不仅可以代理接口还可以代理类,下面我们试试代理类。
创建新的目标对象
public class CglibCalculatorClass { /** * 计算两个数之和 * @param num1 * @param num2 * @return */ public Integer add(Integer num1, Integer num2) { Integer result = num1 + num2; return result; }}
测试类
public class TestCglibProxyClass { public static void main(String[] args) { //目标对象 CglibCalculatorClass target = new CglibCalculatorClass(); System.out.println(target.getClass()); //代理对象 CglibCalculatorClass proxyClassObj = (CglibCalculatorClass) new CglibProxyFactory(target).getProxyInstance(); System.out.println(proxyClassObj.getClass()); //执行代理方法 Integer result = proxyClassObj.add(1,2); System.out.println("相加结果:" + result); }}
输出结果
class com.example.java.proxy.cglib1.CglibCalculatorClassclass com.example.java.proxy.cglib1.CglibCalculatorClass$EnhancerByCGLIB$e68ff36c方法调用前,可以添加其他功能....方法调用后,可以添加其他功能....相加结果:3