JDK动态代理

主要利用的两个类是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值