代理类的实现
2016-05-27 10:14
411 查看
代理类分为两种:
1:静态代理,即在编译时期就确定的。个人理解就是对被代理类的一层包装,打个比方:如果你的老妈做饭要用到酱油,老妈总会让你去替她打酱油,而不是她直接去。(此处只是形象化的理解,其实深入比喻不是太恰当)。
2:动态代理,即需要在运行时期才能确定代理的是什么类。用到了反射的相关知识,此处要理解需要补一些反射知识。
以下是我实现的两种代理类,可对比看这样比较容易理解:
1:静态代理,即在编译时期就确定的。个人理解就是对被代理类的一层包装,打个比方:如果你的老妈做饭要用到酱油,老妈总会让你去替她打酱油,而不是她直接去。(此处只是形象化的理解,其实深入比喻不是太恰当)。
2:动态代理,即需要在运行时期才能确定代理的是什么类。用到了反射的相关知识,此处要理解需要补一些反射知识。
以下是我实现的两种代理类,可对比看这样比较容易理解:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //被代理类接口 interface Animal { void run(); } // 实现了Animal接口的被代理类 class Rabbit implements Animal { @Override public void run() { System.out.println("Rabbit is running !!!"); } } // 静态实现代理类 class ProxyClass implements Animal { // 被代理类对象 Animal ani; public ProxyClass(Animal ani) { super(); this.ani = ani; } // 对run()方法的重写实际 上是对被代理类的方法调用,也即实现了包装代理。 @Override public void run() { System.out.println("ProxyClass's run() running!!!"); ani.run(); } } // 实现动态代理的类 class MyInvocationHandler implements InvocationHandler { Object object;// 被代理类实例 // 首先要返回一个代理类对象 public Object blind(Object object) { this.object = object; return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this); } // 可理解为被代理类重写的方法,当通过代理类对被代理类重写方法的主调用时,会调用些方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(object, args); } } // TEST public class ProxyTest { public static void main(String[] args) { // 实例化一个被代理类 Rabbit r = new Rabbit(); // 静态代理测试 System.out.println("静态代理:"); // 实例化一个静态代理类的对象 ProxyClass pc = new ProxyClass(r); pc.run(); // ------------------------------------------------------------------- // 动态代理测试 System.out.println("动态代理:"); // 创建一个实现了InvocationHandler接口的实例对象 MyInvocationHandler mh = new MyInvocationHandler(); // 调用blind()方法,返回一个代理类 Animal proxyRabbit = (Animal) mh.blind(r); // 对invoke()方法的调用 proxyRabbit.run(); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树