- 浏览: 457506 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wwwjiandan:
我现在遇到的问题是将Activity设置为非全屏,且andro ...
Android中软键盘弹出时底部菜单上移问题 -
zjhdreams:
求下载链接
Android 9Patch (NinePatch) -
wtjandjay:
受教了 .......
从程序员到项目经理 -
mr_zhang2011:
将博客搬至CSDN -
fyc0109:
为什么我传过去的值, 有的都不对呢, 顺序也是一样的.就是获得 ...
Android Parcelable序列化自定义类集合在Activity间传递
1.Proxy模式
代理模式支持将某些操作从实际的对象中分离出来,通过它的代理类提供处理。这样便于修改和管理这些特定的操作。
下面示例一个代理模式的实现。
<<interface>>Subject.javapackage com.zj.proxy;
public interface Subject {
void operation1();
void operation2(String arg);
}
现实类RealSubject.javapackage com.zj.proxy;
public class RealSubject implements Subject {
public void operation1() {
System.out.println("Realer do operation1");
}
public void operation2(String arg) {
System.out.println("Realer do operation2 with " + arg);
}
}
代理类ProxySubject.javapackage com.zj.proxy;
public class ProxySubject implements Subject {
private Subject proxied;// 被代理对象
public ProxySubject(Subject proxied) {
this.proxied = proxied;
}
public void operation1() {
System.out.println("Proxyer do operation1");
proxied.operation1();
}
public void operation2(String arg) {
System.out.println("Proxyer do operation2 with " + arg);
proxied.operation2(arg);
}
}
测试类SimpleProxyDemo.javapackage com.zj.proxy.client;
import com.zj.proxy.Subject;
import com.zj.proxy.RealSubject;
import com.zj.proxy.ProxySubject;
public class SimpleProxyDemo {
public static void consumer(Subject subject) {
subject.operation1();
subject.operation2("ZJ");
}
public static void main(String[] args) {
RealSubject real = new RealSubject();
System.out.println("===Without Proxy===");
consumer(real);
System.out.println("===Use Proxy===");
consumer(new ProxySubject(real));
}
}
结果:
===Without Proxy===
Realer do operation1
Realer do operation2 with ZJ
===Use Proxy===
Proxyer do operation1
Realer do operation1
Proxyer do operation2 with ZJ
Realer do operation2 with ZJ
2.使用Java的动态代理机制
设计一个类用于实现InvocationHandle接口,InvocationHandler 是代理实例的调用处理程序实现的接口。
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
<<interface>>InvocationHandle.javapackage java.lang.reflect;
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
对应invoke参数:
[1]proxy - 在其上调用方法的代理实例;
[2]method - 对应于在代理实例上调用的接口方法的 Method 实例;
[3]args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。
现在设计一个类实现该接口,并提供代理实例。
DynamicProxyHandler.javapackage com.zj.proxy.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxyHandler implements InvocationHandler {
private Object proxied;
public DynamicProxyHandler(Object proxied) {
this.proxied = proxied;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("**** proxy: ****\n" + proxy.getClass()
+ "\nmethod: " + method + "\nargs: " + args);
if (args != null)
for (Object arg : args)
System.out.println(" " + arg);
return method.invoke(proxied, args);
}
}
这里的private Object proxied;即代理实例,也即上文代理模式中介绍的RealSubject对象。
在invoke()方法中,我们会打印它的所有参数,并调用当前代理的方法。
测试类DynamicProxyDemo.javapackage com.zj.proxy.client;
import java.lang.reflect.Proxy;
import com.zj.proxy.Subject;
import com.zj.proxy.RealSubject;
import com.zj.proxy.dynamic.DynamicProxyHandler;
public class DynamicProxyDemo {
public static void consumer(Subject subject) {
subject.operation1();
subject.operation2("ZJ");
}
public static void main(String[] args) {
RealSubject real = new RealSubject();
System.out.println("===Without Proxy===");
consumer(real);
System.out.println("===Use Proxy===");
Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class
.getClassLoader(), new Class[] { Subject.class },
new DynamicProxyHandler(real));
consumer(proxy);
}
}
这里通过Proxy的静态方法newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)生成代理类,并传递与其关联的调用处理程序new DynamicProxyHandler(real)。
对于newProxyInstance()的参数:
[1]loader - 定义代理类的类加载器 ;
[2]interfaces - 代理类要实现的接口列表 ;
[3]h - 指派方法调用的调用处理程序 。
测试结果:
===Without Proxy===
Realer do operation1
Realer do operation2 with ZJ
===Use Proxy===
**** proxy: ****
class $Proxy0
method: public abstract void com.zj.proxy.Subject.operation1()
args: null
Realer do operation1
**** proxy: ****
class $Proxy0
method: public abstract void com.zj.proxy.Subject.operation2(java.lang.String)
args: [Ljava.lang.Object;@de6f34
ZJ
Realer do operation2 with ZJ
从结果可以发现,通过代理可以得到当前被调用的方法,及其参数。代理过程可以基于此进行逻辑处理,测试程序只是简单的打印这些相关信息。
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/69996
发表评论
-
《Practical Java》笔记
2014-10-24 13:29 723作者简介:Peter Haggar是IBM在北卡罗来纳州的Re ... -
java集合Collection,Map及子类
2014-10-24 11:43 1009ArrayList Vector LinkedList ... -
清除Android工程中没用到的资源
2014-10-10 13:48 895清除Android工程中没用到的资源 项目需求一改再改, ... -
大型网站系统架构演化之路
2014-09-28 13:40 1188大型网站系统架构演 ... -
如何成为一名比逼格更逼格的java程序员
2014-09-28 10:25 777如何成为一名比逼格 ... -
操作系统原理简介
2014-09-26 15:45 899操作系统原理 我们 ... -
java集合
2013-12-17 10:13 832集合类说明及区别 Collection ├List │├Li ... -
java中的io系统详解
2013-12-17 10:11 677相关读书笔记、心得文章列表 http://blog.cs ... -
java io实践
2013-12-09 17:49 515java中的IO整理 http://www.cnblo ... -
TCP,UDP
2013-12-09 10:49 1054TCP/IP结构对应OSI OSI中的层 ... -
TCP, Scoket, HTTP
2013-12-09 10:37 8541、TCP连接 要想明白Soc ... -
Scoket:TCP通讯模型
2013-12-09 10:35 806Scoket:TCP通讯模型 Socket编程模型是 ... -
final类,方法,变量
2013-07-12 17:46 780见附件: -
在父类获取子类属性
2012-05-11 18:13 2325在父类获取子类属性 在父类中能获取子类的属性吗?一般情况 ... -
java Collection与Map简介
2011-11-29 11:09 1035ArrayList 和Vector是采用数组方式存储 数据, ... -
JAVA 注解---积累
2011-07-27 12:00 1140转载http://www.iteye.com/topic/40 ... -
List的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack
2011-07-06 22:56 1533* * * List的有用实现 ... -
String a = new String("xyz");到底是几个对象?
2011-07-06 22:26 1271String a = new String("xyz ... -
java垃圾收集机制
2011-05-17 22:12 9991.垃圾收集算法的核心 ... -
Java 内存管理原理、内存泄漏实例及解决方案
2011-05-17 21:47 929在项目的最后阶段,就是要防止系统的内存泄漏了,顺便找了些资料 ...
相关推荐
java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...
Java中提供了一个java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。代理类在运行时会根据被代理接口自动生成,并且可以通过InvocationHandler接口对方法进行增强。
本文介绍了动态代理为实现许多常见设计模式提供了替代的动态机制。虽然这些模式不使用动态代理,只用普通的类就能够实现,但是在许多情况下,动态代理方式更方便、更紧凑,可以清除许多手写或生成的类。动态代理是...
设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...
... ... ... package com.gc.dynproxy下为:aop方式动态代理 ...package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) package com.gc.normal下为:通用日志处理方式
Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理. 设计模式中...
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类...
4.7 Proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter与Bridge 144 4.8.2 Composite、Decorator与Proxy 145 第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
4.7 Proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter与Bridge 144 4.8.2 Composite、Decorator与Proxy 145 第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型...
以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成...
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...