靜態代理只能對實現指定介面的類進行代理,當我想為多個介面中的多個方法前後添加邏輯的時候使用靜態代理會變得十分麻煩。
動態代理可以滿足我的要求。
使用JDK的動態代理十分簡單。
需要用到的類有:
java.lang.reflect.InvocationHandler
java.lang.reflect.Proxy
java.lang.reflect.Method
public interface Moveable { public void run();}public interface Stopable { public void stop();}
//需要代理的類public class Car implements Moveable,Stopable{ public void run() { System.out.println("car move"); } public void stop() { System.out.println("car stop"); }}
//實現InvocationHandler介面,定義需要添加的邏輯,可以是時間記錄,日誌記錄,事務等。class LogHander implements InvocationHandler{Object obj;public LogHander(Object obj) {this.obj = obj;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(" log hander start...");Object result = method.invoke(obj, args);System.out.println(" log hander end...");return result;}}
public class Client {public static void main(String[] args) { Car car = new Car(); LogHander h = new LogHander(car); Object proxyCar = java.lang.reflect.Proxy.newProxyInstance(car.getClass().getClassLoader(), new Class[] { Moveable.class, Stopable.class }, h); Moveable m = (Moveable) proxyCar; m.run(); Stopable s = (Stopable) proxyCar; s.stop(); }}