本文共 1967 字,大约阅读时间需要 6 分钟。
基于JDK实现动态代理例子:
需要代理的接口:
public interface MyCalculator { /** * 定义参数加法 * @param a * @param b * @return */ int add(int a , int b);}
需要代理的类:
public class MyCalculatorImpl implements MyCalculator { @Override public int add(int a, int b) { return a + b; }}
代理类:
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @author zb * @date 2020/7/19 10:52 * @Description: */public class CalculatorProxy { public static Object getInstance(MyCalculatorImpl myCalculatorImpl){ return Proxy.newProxyInstance( CalculatorProxy.class.getClassLoader() // 代理类实现的接口 , myCalculatorImpl.getClass().getInterfaces() , new InvocationHandler() { /** * 反射方法 * @param proxy 代理对象 * @param method 代理方法 * @param args 方法参数 * @return 方法的返回值 * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(">>>>>>>>>> 方法开始执行"); Object invoke = method.invoke(myCalculatorImpl, args); System.out.println("<<<<<<<<<< 方法结束执行"); // 方法返回值 return invoke; } } ); }}
测试类:
public class Main { public static void main(String[] args) { MyCalculatorImpl myCalculator = new MyCalculatorImpl(); MyCalculator calculator = (MyCalculator) CalculatorProxy.getInstance(myCalculator); int add = calculator.add(3, 4); System.out.println("add = " + add); }}
测试结果:
>>>>>>>>>> 方法开始执行<<<<<<<<<< 方法结束执行add = 7
文章实例来自于 江南一点雨 spring系列教程
转载地址:http://qhxxi.baihongyu.com/