Java動態代理的理解(知乎轉發)

在知乎上看到一個很好的關於Java動態代理的回答,並且例子也很經典,留着今後複習用了。

Java動態代理相關

先來看靜態代理模式代碼:
package test;

public interface Subject   
{   
  public void doSomething();   
}
package test; 
public class RealSubject implements Subject{ 
    public void doSomething() {
        System.out.println( "call doSomething()" ); 
    } 
}
package test; 
public class SubjectProxy implements Subject { 
    Subject subimpl = new RealSubject(); 
    public void doSomething() { 
        subimpl.doSomething(); 
    }
}
package test;
public class TestProxy {
     public static void main(String args[]) {
        Subject sub = new SubjectProxy();          
        sub.doSomething(); 
      }
}
剛開始我會覺得SubjectProxy定義出來純屬多餘,直接實例化實現類完成操作不就結了嗎?後來隨着業務龐大,你就會知道,實現proxy類對真實類的封裝對於粒度的控制有着重要的意義。但是靜態代理這個模式本身有個大問題,如果類方法數量越來越多的時候,代理類的代碼量是十分龐大的。所以引入動態代理來解決此類問題。

先看代碼:
package test;

public interface Subject   
{   
  public void doSomething();   
}
package test; 
public class RealSubject implements Subject {
   public void doSomething() { 
      System.out.println( "call doSomething()" ); 
   } 
} 
package test; 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 
public class ProxyHandler implements InvocationHandler { 
    private Object tar; //綁定委託對象,並返回代理類 
    public Object bind(Object tar) { 
        this.tar = tar; //綁定該類實現的所有接口,取得代理類 
        return Proxy.newProxyInstance(tar.getClass().getClassLoader(), tar.getClass().getInterfaces(), this); 
    } 
    public Object invoke(Object proxy , Method method , Object[] args)throws Throwable { 
        Object result = null; 
        //這裏就可以進行所謂的AOP編程了 
        //在調用具體函數方法前,執行功能處理 
        result = method.invoke(tar,args); 
        //在調用具體函數方法後,執行功能處理 
        return result; 
    } 
}
public class TestProxy { 
public static void main(String args[]) { 
    ProxyHandler proxy = new ProxyHandler(); //綁定該類實現的所有接口 
    Subject sub = (Subject) proxy.bind(new RealSubject()); 
    sub.doSomething(); 
  } 
}
看完代碼,現在我來回答,動態代理的作用是什麼:
  1. Proxy類的代碼量被固定下來,不會因爲業務的逐漸龐大而龐大;
  2. 可以實現AOP編程,實際上靜態代理也可以實現,總的來說,AOP可以算作是代理模式的一個典型應用;
  3. 解耦,通過參數就可以判斷真實類,不需要事先實例化,更加靈活多變。

轉載自知乎 :https://www.zhihu.com/question/20794107/answer/23330381

發佈了49 篇原創文章 · 獲贊 308 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章