若是我要访问一个明星,我不可能直接去找明星,也根本找不到,这个时候,我就只能找他的经纪人。测试
代理是同样的,this
若是一个对象想要访问另外一个对象,可是不能直接访问到,或者不想直接访问到,那么就须要一个中间人,至关于一个经纪人同样的角色,就是代理对象.net
代理对象能找到咱们要访问的真实对象吗?答案是确定的,否则要他干吗,就像是,经纪人确定能找到明星代理
代理对象怎么找到真实对象呢?那是由于代理对象持有一个真实对象的引用对象
/** * 代理类 * Created by lidongyang on 2017/8/22 0022. */ public class Broker implements Person{ //真实对象的引用 private SuperStar linzhiling; public Broker(SuperStar linzhiling){ this.linzhiling = linzhiling; } public void getMsg() { System.out.println("经纪人某某某"); if(null == linzhiling){ linzhiling = new SuperStar(); } linzhiling.getMsg(); System.out.println("您好,您是?"); } }
/** * 真实类 * Created by lidongyang on 2017/8/22 0022. */ public class SuperStar implements Person{ public void getMsg(){ System.out.println("我叫林志玲,我是个明星"); } }
/** * 共同实现的接口,抽象类也可 * Created by lidongyang on 2017/8/22 0022. */ public interface Person { void getMsg(); }
/** * 测试方法 * Created by lidongyang on 2017/8/21 0021. */ public class LockTest{ public static void main(String[] args) { Broker broker = new Broker(new SuperStar()); broker.getMsg(); } }
输出blog
不难看出,若是一个对象须要代理类的话,每次都须要新建一个代理类,若是每一个类都须要一个代理类,那得多少代理类,太痛苦了。并且这个真实的类必须是已知的接口
怎么解决这个难题呢,答案就是动态代理,动态代理另一片文章写get
cglib动态代理地址:http://www.javashuo.com/article/p-hnstkwab-mv.htmlclass
jdk动态代理地址:http://www.javashuo.com/article/p-cewhubet-mu.htmljdk