InvocationHandler接口—讨论

 动态代理是很多框架和技术的基础, spring 的AOP实现就是基于动态代理实现的。了解动态代理的机制对于理解AOP的底层实现是很有帮助的。

查看doc文档就可以知道,在java.lang.reflect包中有一个叫Proxy的类。

         Proxy类的设计用到代理模式的设计思想,Proxy类对象实现了代理目标的所有接口,并代替目标对象进行实际的操作。但这种替代不是一种简单的替代,这样没有任何意义,代理的目的是在目标对象方法的基础上作增强,这种增强的本质通常就是对目标对象的方法进行拦截。所以,Proxy应该包括一个方法拦截器,来指示当拦截到方法调用时作何种处理。InvocationHandler就是拦截器的接口。

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

        Object proxyObj =Proxy.newProxyInstance(
         animal.getClass().getClassLoader(),
        animal.getClass().getInterfaces(), 
         XXXClass)

Proxy.newProxyInstance方法用来指定你要绑定的目标和其实现的接口,和它属于哪种类的实例,格式是 [实例名.getClass().getClassLoader(),  实例名.getClass().getInterfaces(), 监听类(需要实现InvocationHandler接口)]

然后是 invoke方法了 【装饰者封装后的实例;实例的方法;方法的参数列表】 然后就可以对他们进行监听拦截了

   当然不需要拦截的方法可以用method.invoke(实例名, args)不妨碍其执行;需要拦截的可以通过对传进来的参数进行判断,做相应的处理。

  (特别强调:InvocationHandler的invoke方法是面向接口的,对类自身的方法不起到拦截作用,所以要将需要拦截的方法定义到接口中)

   

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值