Java动态代理的实现

       动态代理可以在不修改被代理对象源码的情况下,为代理对象添加其他的逻辑功能,可以使用继承和组合两种方式实现,但是那样如果被代理对象很多的情况下实现是不太可能的。

首先,新建一个类,实现InvocationHandler,在里面加上自己的逻辑

public class LogInterceptor implements InvocationHandler {

    private Object target;//被代理对象

    public Object getTarget() {

       return target;

    }

    public void setTarget(Object target) {

       this.target = target;

    }

    private void beforeMethod(Method method){

       //自己添加的业务逻辑

       System.out.println(method.getName()+" start");

    }

    @Override

    public Object invoke(Object proxy, Method method, Object[] args)

           throws Throwable {

       beforeMethod(method);//先调用自己的逻辑

       method.invoke(target, args);//然后调用被代理对象的方法

       return null;

    }

}

 

测试类:

    @Test

    public void testProxy(){

       //首先新建一个被代理对象

       UserDAO userDAO = new UserDAOImpl();

       LogInterceptor interceptor = new LogInterceptor();

       //将被代理对象设置进去

       interceptor.setTarget(userDAO);

       //新建代理

       UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), interceptor);

       userDAOProxy.save(new User());

       userDAOProxy.delete();

    }

控制台输出:

save start
user saved!
delete start
user deleted

 

通过实验可以知道,这个userDAOProxy的类是$Proxy4,它实现了接口UserDAO,当它调用save(user)方法的时候,由于InvocationHandler的实现类interceptor已经传给它,在这个时候,它首先通过接口UserDAO取得其中的方法Method method = userDAO.getClass().getMethod(),然后调用自身的invoke()方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值