标签:
1 用于实现代理。静态代理
如果不用InvocationHandler接口实现代理的话,我们写代码是这样的:
定义一个接口:
实现这个接口:
实现一个代理类
2 动态代理
代理其实没什么的,再看看如果实现了InvocationHandler接口,
我们怎样实现代理。
还是要实现原来的Greet接口。
接口的实现还是GreetImpl。
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(); } }
标签:
原文地址:http://www.cnblogs.com/daxiong225/p/4713992.html