Java 代理的理解
阿新 • • 發佈:2018-11-30
java 的代理分為三種類型: 靜態代理(JDK)、動態代理(JDK)、Cglib代理
一 、靜態代理
靜態代理比較好理解:(個人通俗理解)
靜態代理
代理: 由一個類代替另外一個類去工作,那麼兩個類必須保證處理的是同一個事件(interface)
靜態: 指定好代理之後,不能更改
程式碼邏輯:
interface Animal{ void eat(); } class Pig implements Animal{ public void eat(){ System.out.println("吃吃吃吃吃吃吃吃"); } } class PigProxy implements Animal{ Pig pig = new Pig(); @Override public void eat() { System.out.println("我是靜態代理 豬哥開吃了~"); pig.eat(); System.out.println("我是靜態代理 吃完了~"); } } public static void main(String[] args){ new PigProxy ().eat(); } 輸出: 我是靜態代理 豬哥開吃了~ 吃吃吃吃吃吃吃吃 我是靜態代理 吃完了~
從程式碼中也可以比較清楚的看到,靜態代理就是實際處理類Pig 和 代理類PigFactory 都集成了Animal,這樣實際處理類 和代理類在事件處理上就能保持一致了(這個思想很重要 ,JDK的動態代理 和 Cglib的動態代理的實現也是按照這個思路去做的)。
二、動態代理(JDK)
動態代理
代理: 這個代理的精妙之處在於,java虛擬機器 幫你建立一個"PigFactory" , 你不需要建立"PigFactory" ,並且也不需要你對"PigFactory" 類去實現介面,所有的動作是java虛擬機器幫你做。
java虛擬機器如何幫你做?:
通過類載入器(Pig的ClassLoader) 和 Pig的介面(Animal) 建立(如果快取中有就直接用不需要建立)代理類
示例程式碼:
interface Animal{ void eat(); } class Pig implements Animal{ public void eat(){ System.out.println("吃吃吃吃吃吃吃吃"); } } class ProxyFactory implements InvocationHandler{ Object object; public Object getInstance(Object obj){ object = obj; return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("豬哥開始吃了~"); method.invoke(object,args); System.out.println("豬哥吃完了~"); return null; } } 輸出: 豬哥開始吃了~ 吃吃吃吃吃吃吃吃 豬哥吃完了~