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接口的實現:GreetImplthis.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

疑问:

动态代理和委托之间有什么关系?
给的例子明明就是一个动态代理嘛。

java中实现代理及委托代理模式相关推荐

  1. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

  2. 轻松学,Java 中的代理模式(proxy)及动态代理

    我们先来分析代理这个词. 代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客 ...

  3. Java中的代理模式

    1.什么是代理模式 代理模式:就是为其他对象提供一种代理以控制对这个对象的访问. 代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能). 举个例子来说明代理的作用: 一般我们想邀请明星来当 ...

  4. 轻松学,Java 中的代理模式及动态代理

    前几天我写了<秒懂,Java 注解 (Annotation)你可以这样学>,因为注解其实算反射技术中的一部分,然后我想了一下,反射技术中还有个常见的概念就是动态代理,于是索性再写一篇关于动 ...

  5. java中动态代理实现机制

    v前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  6. Java中通过代理对类进行修改

    JAVA中的静态代理.动态代理及JDK proxy和CGLIB.Javassist.ASM实践 简介 Java中对已经有的类进行修改,改变或调整其执行,这可以通过代理来实现.Java的class文件是 ...

  7. Java中避免if-else-if:策略模式

    本文仅仅为入门,高手勿喷. 实际工作中,我们总会遇到类似如下的需求: 某支付系统接入以下几种商户进行充值:易宝网易,快线网银,19pay手机支付,支付宝支付,骏网一卡通,由于每家充值系统的结算比例不一 ...

  8. 详解Java中的clone方法 -- 原型模式

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

  9. java clone原理_详解Java中的clone方法 -- 原型模式

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

最新文章

  1. docker常用命令行集锦
  2. Java将异常入库_Exception异常库
  3. 对象存储/编码/解码
  4. ASP.NET MVC中如何以ajax的方式在View和Action中传递数据
  5. 机器学习之——学习率
  6. PyCharm安装和配置教程
  7. mac os x10.9.2 查看进程对应端口
  8. aws python lambda_python – AWS Lambda发送HTTP请求
  9. centos mysql5.6.35_centos6.8 mysql 5.6.35 glibc安装
  10. 【NLP】一文了解词性标注CRF模型
  11. 计算机保研厦大面试,保研其实不难:他们保研人大、厦大、山大,有这些经验,值得收藏!...
  12. Pdf转Word用Python轻松完成
  13. win7计算机隐藏文件,Win7怎么设置隐藏文件夹和取消隐藏?-win7显示隐藏文件
  14. 加班申请 ----中间表--系统自动算出---可调休天数
  15. 操作系统之短作业优先实现代码
  16. C语言snprintf函数
  17. JAVA编写文件格式转换UTF-8
  18. zemax---Tangential plane, meridian plane and sagittal plane(切线面,子午面与弧矢面)(完结)
  19. 小程序能给创业者带来什么?内容小程序创业机会来了
  20. linux常用-设置代理及IP

热门文章

  1. 当虚幻4遇上VR会发生什么?《全球使命VR》来袭!
  2. Crack看雪论坛加解密的一个破解案例程序
  3. Spring AOP 和 AspectJ的区别
  4. 合口味董事长孙小荔荣获“深圳首届十大金口碑人物”称号
  5. 诚信通(b2b)信息发布5大核心技巧
  6. DirectX Jun2010 安装error S1023
  7. 兄弟Brother PT-P710BT 驱动
  8. 漏洞扫描工具 -- awvs13
  9. 跨境电商亚马逊这个行业还能赚钱吗,行业未来在哪里?
  10. 微信菜单 html页面添加的,微信公众号添加菜单栏外部链接(微信添加外部链接方法)...