1. 程式人生 > >Java 代理的理解

Java 代理的理解

   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;
        }
    }

輸出:
豬哥開始吃了~
吃吃吃吃吃吃吃吃
豬哥吃完了~