JDK动态代理

    科技2022-08-18  104

    主要利用的两个类是java.lang.reflect包下的Proxy类和InvocationHandler类

    实现步骤

    1、创建接口,定义方法 public interface UserDao { int add(int a, int b); } 2、创建接口实现类,实现接口方法(该实现类即为被代理对象) public class UserDaoImpl implements UserDao { public int add(int a, int b) { return a+b; } } 3、创建InvocationHandler的实现类,将被代理对象传入,并重写invoke方法(在该方法中添加增强逻辑) class UserDaoProxy2 implements InvocationHandler { //1、传入被代理对象,用两种方式:1:有参构造器;2、set方法 private Object obj; public UserDaoProxy2(Object obj){ this.obj = obj; } public UserDaoProxy2() { } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法之前 System.out.println("前...方法名:" + method.getName() + " 参数:" + Arrays.asList(args)); //方法执行,执行被代理对象的对应的方法 System.out.println("方法开始执行"); Object result = method.invoke(obj, args); //方法之后 System.out.println("后...result=" + result + " obj=" + obj); return result; } } 4、编写测试类测试,使用Proxy的newProxyInstance方法获取代理类对象,注意传入的三个参数。 1、类加载器; 2、实现的接口的运行时类; 3、InvocationHandler的实现类(一般是在该类中写方法获取代理实例) public class JDKProxy2 { public static void main(String[] args) { //第一个参数:类加载器 //第二个参数:需实现的接口的运行时类数组 Class[] interfaces = {UserDao.class}; //第三个参数:InvocationHandler的实现类对象 UserDao userDao = new UserDaoImpl(); //获取代理类实例 UserDao o = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy2(userDao)); int add = o.add(2, 4); System.out.println("输出:" + add); } }

    输出结果:

    前...方法名:add 参数:[2, 4] 方法开始执行 后...result=6 obj=com.kuang.demo2_dynamic.UserDaoImpl@66d3c617 输出:6
    Processed: 0.020, SQL: 9