若是我要訪問一個明星,我不可能直接去找明星,也根本找不到,這個時候,我就只能找他的經紀人。測試
代理是同樣的,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