java中的静态和动态代理Proxy

  理解java代理,应该是从最简单的静态代理开始。代理是对对象方法的一种增强,比如增加日志,静态代理的特点在于代理类只能代理一个一个类,并且要事先要编写好。

  动态代理则对被代理对象进行了抽象,使一个代理对象就可以代理很多对象,把业务对象,method,args抽象为普通对象,方法对象,参数对象等。

  InvocationHandler 是一个接口,官方文档解释说,每个代理的实例都有一个与之关联的 InvocationHandler 实现类,如果代理的方法被调用,那么代理便会通知和转发给内部的 InvocationHandler 实现类,由它决定处理。

public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}

 

method.invoke(ldh, args); //这个方法是核心,很重要,调用了被代理对象的方

     可以说,这两个invoke方法就是动态代理的核心,动态代理还多了一个对象proxy。

     代理技术是一种设计模式,其中动态代理也是Aop的基础,其中用到了两个重要的接口和类InvocationHandler,Proxy。

   动态代理又分为jdk和cglib,这两种差别,一些博客已经说得很清楚了。

     编写代码过程中发现了一个非常隐秘的错误:obj=this.obj;所以百度了很多东西,因为他们根本不会犯这种低级的错误,所以我浪费了很多时间,但是也对Proxy.newInstance()的使用印象深刻。在实在找不到错误的时候,我选择了copy一份,这是万不得已的方法,对于小的demo有用,但是如果在大型软件中就不行了。如果按照java的语法规则写,原则是不会出错的,但是我犯了很多错误,浪费了时间,所以做事要严谨。

  如果我们不借助框架,实现动态代理,就得

  

附上两篇文章:

轻松学,Java 中的代理模式及动态代理

jdk动态代理和cglib动态代理详解

Proxy对象是如何调用invoker方法

posted @ 2019-01-08 22:49  懂得了才能做一些改变  阅读(308)  评论(0编辑  收藏  举报