Java中代理是很常見的一種編程模型,它的主要目的是為了幫助我們解耦代碼,降低代碼的復雜度。Java中常見的代理有靜態代理和動態代理。那么,它們之間有什么區別呢?
靜態代理
靜態代理使用構造函數或設置方法直接創建類的實例,它們提供了和原來接口相似的方法,同時在方法調用前后可以進行一些操作。
public interface Subject { public void doSomething(); } public class RealSubject implements Subject{ @Override public void doSomething() { System.out.println("RealSubject doSomething..."); } } public class ProxySubject implements Subject{ private Subject subject; public ProxySubject(Subject subject) { this.subject = subject; } @Override public void doSomething() { System.out.println("before doSomething ..."); subject.doSomething(); System.out.println("after doSomething ..."); } public static void main(String[] args) { ProxySubject proxySubject = new ProxySubject(new RealSubject()); proxySubject.doSomething(); } }
在上面的例子中,RealSubject就是被代理類,ProxySubject就是代理類,實現Subject接口(或者說是繼承Subject類),并在構造方法中傳入RealSubject實例。同時,也實現了Subject接口的doSomething方法,在代理模式下,我們修改了RealSubject在doSomething方法前后的動作。
動態代理
動態代理是在程序運行時,通過反射機制動態生成一個代理類來代替原始類,因此可以實現多個接口的方法代理。
public interface Subject { public void doSomething(); } public class RealSubject implements Subject{ @Override public void doSomething() { System.out.println("RealSubject doSomething..."); } } public class DynamicProxyHandler implements InvocationHandler { private Object realObject; public DynamicProxyHandler(Object realObject) { this.realObject = realObject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before doSomething ..."); method.invoke(realObject, args); System.out.println("after doSomething ..."); return null; } public static void main(String[] args) { Subject realSubject = new RealSubject(); InvocationHandler handler = new DynamicProxyHandler(realSubject); Subject proxySubject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler); proxySubject.doSomething(); } }
在上面的例子中,我們使用實現InvocationHandler接口的代理句柄DynamicProxyHandler來實現動態代理。我們需要傳入realObject實例,然后在invoke方法中,我們使用Java反射機制技術,并在原始對象方法調用前后加入我們需要的操作。最后,我們使用Proxy.newProxyInstance方法來獲取代理實例。
總結
靜態代理和動態代理都是Java中常見的代理編程模型,但是兩者在實現方式上有所不同。靜態代理是在編寫期固定的代理方式,而動態代理是在運行期生成的代理方式。同時,動態代理又可以實現多個接口的方法代理,而靜態代理則需要為每個被代理對象單獨編寫代理類。
上一篇ajax自動發送請求數據
下一篇css數字增加動畫效果