java中实现代理及委托代理模式
来源:互联网 发布:软件系统启动超时 编辑:程序博客网 时间:2024/05/18 04:01
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 tmp = new GreetImpl(); //生成代理 Greet greet = new SimpleProxy(tmp); 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:方法要傳入的參數 //invoke实现对GreetImpl中方法的调用,同时也可以在这里加入自己想要实现的操作, //虽然调用原GreetImpl中的方法重要,但我想这里更看重的是通过自定义处理实现GreetImpl中没有的功能
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 //通过DebugProxy构造的greet比原temp拥有更多功能 greet.sayHello("walter"); greet.goodBye(); }}
参考:
http://leowzy.iteye.com/blog/725345
还有一篇文章,也可以参考一下:
http://www.cnblogs.com/soojoe/archive/2012/04/12/2532304.html
疑问:
动态代理和委托之间有什么关系?
给的例子明明就是一个动态代理嘛。
0 0
- java中实现代理及委托代理模式
- java中实现代理及委托代理模式
- 用Java动态代理实现委托模式
- 用Java动态代理实现委托模式
- 代理模式及Java实现动态代理
- 代理模式及Java实现动态代理
- 代理模式-Java动态代理的实现及应用
- Java动态代理(代理模式/委托模式)
- Java实现代理模式
- 代理模式(java实现)
- OC_协议实现代理委托模式
- Java中代理模式的实现步骤
- java的委托机制 .....代理模式
- java代理模式及动态代理类
- 代理模式及Java动态代理
- Java代理模式及动态代理
- Java代理模式及动态代理
- Java 中的代理模式及动态代理
- acm 常用数据结构与算法专题(未分类均放于此)
- 数据库复习7——恢复
- 【Scala编程】格式化算术表达式程序
- HTML 4.0笔记(精华浓缩版)
- ios官方开发文档
- java中实现代理及委托代理模式
- 高效 , 极致, 口碑, 快
- Android中的Handler, Looper, MessageQueue和Thread.关系
- Unity ----- 对象池GameObjectPool
- java初学者知识小总结-01(byte数据类型赋值出错)
- unity的自动寻路之 ------ wayPoint寻路的实现方式
- unix环境高级编程----进程控制wait()
- Storm开发过程中遇到的Topology “hang"问题
- spring学习笔记(7)——spring事务管理方式