InvocationHandler 用於實現代理。
如果不用InvocationHandler介面實現代理的話,我們寫代碼是這樣的:
定義一個介面:
-
Java code
-
interface Greet{ void sayHello(String name); void goodBye();}
實現這個介面:
-
Java code
-
class GreetImpl implements Greet{ public void sayHello(String name) { System.out.println("Hello " + name); } public void goodBye() { System.out.println("Good bye."); }}
實現一個代理類
-
Java code
-
public class SimpleProxy implements Greet{ private Greet greet = null; SimpleProxy(Greet greet) { this.greet = greet; } public void sayHello(String name) { System.out.println("--before method sayHello"); greet.sayHello(name); System.out.println("--after method sayHello"); } public void goodBye() { System.out.println("--before method goodBye"); greet.goodBye(); System.out.println("--after method goodBye"); } /** * @param args */ public static void main(String[] args) { Greet greet = new SimpleProxy(new GreetImpl());//組建代理程式 greet.sayHello("walter"); greet.goodBye(); }}
代理其實沒什麼的,再看看如果實現了InvocationHandler介面,
我們怎樣實現代理。
還是要實現原來的Greet介面。
介面的實現還是GreetImpl。
-
Java code
-
import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class DebugProxy implements java.lang.reflect.InvocationHandler{ private Object obj; public static Object newInstance(Object obj) { return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new DebugProxy(obj)); } private DebugProxy(Object obj) { //Greet介面的實現:GreetImpl this.obj = obj; } //Method m:調用的方法 //Object[] args:方法要傳入的參數 public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object result; try { //自定義的處理 System.out.println("--before method " + m.getName()); //調用GreetImpl中方法 result = m.invoke(obj, args); } catch(InvocationTargetException e) { throw e.getTargetException(); } catch(Exception e) { throw new RuntimeException("unexpected invocation exception: " + e.getMessage()); } finally { System.out.println("--after method " + m.getName()); } return result; } /** * @param args */ public static void main(String[] args) { Greet tmp = new GreetImpl(); Greet greet = (Greet) DebugProxy.newInstance(tmp); //產生的greet和tmp有相同的hashCode greet.sayHello("walter"); greet.goodBye(); }}