这一篇将会讲到利用java的反射机制而设计的动态代理模式。
•代理模式一般涉及到的角色有
抽象角色:声明真实对象和代理对象的共同接口。
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
如果像上面描述那样,每个代理角色“都持有对真实对象的引用,并同时提供与真实对象相同的接口一遍在任何时刻代替真实对象”的话,那么我们可以很容易想象,随着需要代理的类增多,很快就会出现“类爆炸”的现象。
动态代理,是指在不知道真实角色的情况下,去调用正确的方法。
其实很简单,不要想得太复杂了,就是利用监听传进来的对象,在调用此方法时,在这方法之间做一个调用。
好啦,直接代码吧:
首先是抽象角色
package com.insigma.dymic;
public interface Subject {
public void request();
}
真实角色,就直接实现这接口就可以了
package com.insigma.dymic;
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("RealSubject do this");
}
}
代理角色:
package com.insigma.dymic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicSubject implements InvocationHandler{
private Object sub;
public DynamicSubject(){
}
public DynamicSubject(Object object){
sub = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before calling " + method);
method.invoke(sub, args);
System.out.println("after calling " + method);
return null;
}
}
使用代理角色的客户端:
package com.insigma.app;
import java.lang.reflect.InvocationHandler;
import com.insigma.dymic.DynamicSubject;
import com.insigma.dymic.ProxyUtil;
import com.insigma.dymic.RealSubject;
import com.insigma.dymic.Subject;
public class DynamicProxyApp {
public static void main(String[] args) {
Subject sub = new RealSubject();
sub = (Subject) ProxyUtil.getInstance(sub);
sub.request();
}
}
客户端的工具类:
package com.insigma.dymic;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
public class ProxyUtil {
public static Object getInstance(Object obj){
InvocationHandler ds = new DynamicSubject(obj);
Class cls = obj.getClass();
Class c = Proxy.getProxyClass(cls.getClassLoader(), cls.getInterfaces());
try {
Constructor cons = c.getConstructor(new Class[]{InvocationHandler.class});
obj = cons.newInstance(new Object[]{ds});
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return obj;
}
}
其实理清思路之后很简单,整一个测试的手敲代码连50行都没有。关键是要自己去想,自己想明白的才是你理解到的。
分享到:
相关推荐
浅谈java代理机制 .txt 浅谈java代理机制 .txt
浅谈Java中Mysql数据库的连接与操作.pdf
注意力机制浅谈注意力机制及其作用浅谈注意力机制及其作用浅谈注意力机制及其作用浅谈注意力机制及其作用浅谈注意力机制及其作用浅谈注意力机制及其作用浅谈注意力机制及其作用浅谈注意力机制及其作用浅谈注意力机制...
浅谈Java优势,关于java优势......
【ASP.NET编程知识】浅谈.NET反射机制的性能优化 附实例下载.docx
浅谈JAVA垃圾回收机制.pdf
浅谈Java软件测试.pdf
·拒绝晦涩难懂的呆板教学,宋老师语言生动幽默,举例形象生动深入浅出,迅速让你把握问题本质,四两拨千斤 2.课程内容推陈出新: ·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse...
Java反射技术浅谈
浅谈Java的多线程机制.pdf
Java 对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized 关键 字就可以轻松地解决多线程共享数据同步问题。到底如何?――还得对synchronized 关键字 的作用进行深入了解才可定论。 总的说来,...
浅谈Java串行端口技术协议 浅谈JAVA串行端口技术协议 1 一、串行通讯慨述 2 二、RS232通讯基础 2 三、常见的边线方式 2 四、小技巧:如何辨别TXD和RXD端口? 3 五、安装JAVA COMMUNICATIONS API 3 六、通讯前的准备...
浅谈java中的几种随机数,浅谈java中的几种随机数,浅谈java中的几种随机数,浅谈java中的几种随机数
1、到底什么叫反射 2、Class类的作用 3、Class类的实例化三种...Class类在一般的基本开发是不会有任何作用的,完全可以不会,但是,对于一些高端的开发框架,所有的基本的核心原理都在于反射机制的应用上。 8、代理模式
Java反射技术浅谈 (1)
浅谈Java的输入输出流.pdf 浅谈Java的输入输出流.pdf
Java分布式应用学习笔记06浅谈并发加锁机制分析
java垃圾回收机制,很详细的解释了垃圾回收机制是如何运作的,对知识做一个充分的解释
浅谈JAVA技术.pdf
浅谈JAVA语言.pdf