java中实现代理及委托代理模式
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中实现代理及委托代理模式相关推荐
- Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别
视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...
- 轻松学,Java 中的代理模式(proxy)及动态代理
我们先来分析代理这个词. 代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客 ...
- Java中的代理模式
1.什么是代理模式 代理模式:就是为其他对象提供一种代理以控制对这个对象的访问. 代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能). 举个例子来说明代理的作用: 一般我们想邀请明星来当 ...
- 轻松学,Java 中的代理模式及动态代理
前几天我写了<秒懂,Java 注解 (Annotation)你可以这样学>,因为注解其实算反射技术中的一部分,然后我想了一下,反射技术中还有个常见的概念就是动态代理,于是索性再写一篇关于动 ...
- java中动态代理实现机制
v前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...
- Java中通过代理对类进行修改
JAVA中的静态代理.动态代理及JDK proxy和CGLIB.Javassist.ASM实践 简介 Java中对已经有的类进行修改,改变或调整其执行,这可以通过代理来实现.Java的class文件是 ...
- Java中避免if-else-if:策略模式
本文仅仅为入门,高手勿喷. 实际工作中,我们总会遇到类似如下的需求: 某支付系统接入以下几种商户进行充值:易宝网易,快线网银,19pay手机支付,支付宝支付,骏网一卡通,由于每家充值系统的结算比例不一 ...
- 详解Java中的clone方法 -- 原型模式
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- java clone原理_详解Java中的clone方法 -- 原型模式
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
最新文章
- docker常用命令行集锦
- Java将异常入库_Exception异常库
- 对象存储/编码/解码
- ASP.NET MVC中如何以ajax的方式在View和Action中传递数据
- 机器学习之——学习率
- PyCharm安装和配置教程
- mac os x10.9.2 查看进程对应端口
- aws python lambda_python – AWS Lambda发送HTTP请求
- centos mysql5.6.35_centos6.8 mysql 5.6.35 glibc安装
- 【NLP】一文了解词性标注CRF模型
- 计算机保研厦大面试,保研其实不难:他们保研人大、厦大、山大,有这些经验,值得收藏!...
- Pdf转Word用Python轻松完成
- win7计算机隐藏文件,Win7怎么设置隐藏文件夹和取消隐藏?-win7显示隐藏文件
- 加班申请 ----中间表--系统自动算出---可调休天数
- 操作系统之短作业优先实现代码
- C语言snprintf函数
- JAVA编写文件格式转换UTF-8
- zemax---Tangential plane, meridian plane and sagittal plane(切线面,子午面与弧矢面)(完结)
- 小程序能给创业者带来什么?内容小程序创业机会来了
- linux常用-设置代理及IP
热门文章
- 当虚幻4遇上VR会发生什么?《全球使命VR》来袭!
- Crack看雪论坛加解密的一个破解案例程序
- Spring AOP 和 AspectJ的区别
- 合口味董事长孙小荔荣获“深圳首届十大金口碑人物”称号
- 诚信通(b2b)信息发布5大核心技巧
- DirectX Jun2010 安装error S1023
- 兄弟Brother PT-P710BT 驱动
- 漏洞扫描工具 -- awvs13
- 跨境电商亚马逊这个行业还能赚钱吗,行业未来在哪里?
- 微信菜单 html页面添加的,微信公众号添加菜单栏外部链接(微信添加外部链接方法)...