Java中的代理是一種常用的設計模式,可以在不改變原有代碼的情況下,為其添加額外的功能。
靜態代理和動態代理是代理模式中比較常見的兩種形式。
靜態代理
靜態代理是在編譯期就已經確定代理對象的類型,需要手動編寫代理類。
下面是靜態代理的一個示例:
public interface Subject { void doSomething(); } public class RealSubject implements Subject { public void doSomething() { System.out.println("RealSubject do something."); } } public class ProxySubject implements Subject { private Subject realSubject; public ProxySubject(Subject realSubject) { this.realSubject = realSubject; } public void doSomething() { System.out.println("ProxySubject do something before"); realSubject.doSomething(); System.out.println("ProxySubject do something after"); } public static void main(String[] args) { Subject subject = new RealSubject(); Subject proxy = new ProxySubject(subject); proxy.doSomething(); } }
上面的代碼演示了一個簡單的靜態代理,其中RealSubject表示真正要被代理的對象,ProxySubject作為代理對象,代理RealSubject的行為。
動態代理
動態代理是在運行期間生成代理對象,不需要手動編寫代理類。在Java中,可以使用JDK自帶的動態代理機制實現。
下面是動態代理的一個示例:
public interface Subject { void doSomething(); } public class RealSubject implements Subject { public void doSomething() { System.out.println("RealSubject do something."); } } public class ProxyHandler implements InvocationHandler { private Subject realSubject; public ProxyHandler(Subject realSubject) { this.realSubject = realSubject; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("ProxySubject do something before"); Object result = method.invoke(realSubject, args); System.out.println("ProxySubject do something after"); return result; } public static void main(String[] args) { Subject subject = new RealSubject(); InvocationHandler handler = new ProxyHandler(subject); Subject proxy = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), subject.getClass().getInterfaces(), handler); proxy.doSomething(); } }
上面的代碼演示了一個簡單的動態代理,其中RealSubject表示真正要被代理的對象,ProxyHandler作為代理處理器,代理RealSubject的行為。在main方法中,使用Proxy.newProxyInstance方法就可以動態生成代理對象。