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. 34.对象 GC,GC属性,影响GC的因素,GC步骤,GC算法,安全区/安全区域,新生代,老年代等介绍
  2. [Swift]LeetCode826. 安排工作以达到最大收益 | Most Profit Assigning Work
  3. Java如何以及为什么使用Unsafe?
  4. 20150303+JQuery选择器-02
  5. 《机器人学经典教程》——2.1 控制理论
  6. 怎么在苹果手机计算机上打字,iPhone苹果手机在打字时如何进行换行
  7. 数据结构考研复试、面试 ——常见提问总结
  8. 硬笔书法三要素:笔法、结构和章法
  9. [导入]【沈殿霞张曼玉经典爆笑鬼片】《双肥临门》【国语DVD中字】
  10. expect spawn scp * shell路径名展开
  11. 数据库设计(一) 需求分析
  12. 2022 年全球重大经济事件盘点( I )
  13. 服务器里微信怎么多开,谈谈微信多开
  14. PV、UV、IP之间的区别与联系
  15. 对Chrome进行扩展【极简插件】
  16. 四路服务器性能是两路的两倍,至强E7助力四路服务器 性能才是王道
  17. 第三周--AEM汇编语言编程入门
  18. 给明年依然年轻的我们
  19. postgre 年月日转年月_关于datetime:带时区的PostgreSQL日期函数date()
  20. nacos源码修改编译(亲测)

热门文章

  1. 方阵可逆,方阵行列式≠0,方阵满秩三者关系推导
  2. Phonetic symbol 单元音 - 短元音 ɒ(新)/ ɔ(旧) 与 ʊ/u (机打)
  3. python flask上传文件_flask 文件上传(单文件上传、多文件上传)--
  4. 中国化妆品用脂质体市场现状研究分析与发展前景预测报告
  5. 第十四章:下载安装WinRAR
  6. Bootstrap5 导航栏
  7. 使用python简单的抓取网络小说
  8. 外界用户对支付宝登录密码认知度较低,只知道支付密码,因此设计如此
  9. Echarts时间轴补刻度
  10. 南邮计算机学院张晓霞,南京邮电大学第四届海内外青年学者云论坛通信与信息工程学院分论坛成功举办...