java中InvocationHandler 用于实现代理。

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(); } }
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值