Java代理实例解析
2018-05-16 10:40
162 查看
1.代理模式
- 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.
- 这样做可在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
- 这里使用到的一个思想:不要随意去修改别人已写好的代码或方法,如需修改,可通过代理方式来扩展
例如想邀请一位明星,并不是直接联系明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只负责活动中的节目,其他琐碎的事就交给他的代理人(经纪人)来解决.
2.静态代理
- 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.
假如有个码农,开发个app,客户有天直接找到他说加个功能。码农心想我不要面子的啊,你去找项目经理(代理)和他谈。
首先先来个接口类
public interface ICoder { public void impldemand(String functionname); }
再来个真实码农对象
public class JavaCoder implements ICoder { private String name; public JavaCoder(String name){ this.name=name; } @Override public void impldemand(String functionname) { // TODO Auto-generated method stub System.out.println(name + " implemented demand:" + functionname + " in JAVA!"); } }
代理对象(经理)
public class CoderProxy implements ICoder { private ICoder coder; public CoderProxy(ICoder coder){ this.coder=coder; } @Override public void impldemand(String functionname) { // TODO Auto-generated method stub System.out.print("项目经理:"); coder.impldemand(functionname); } }
最后实现下
public class test { public static void main(String args[]){ ICoder coder=new JavaCoder("xx码农"); ICoder proxy=new CoderProxy(coder); proxy.impldemand("add function1"); } }实现效果如:
经理:xx码农 implemented function:add function1 in JAVA!
这样就完成了经理去告诉码农完成什么任务,不需要客户直接与码农交流,也就保住了码农的面子,码农专心撸码。
但是
虽静态代理可在不修改目标对象的功能前提下,对目标功能扩展.
代理类的源代码是由程序员编写的,在程序运行前它的.class文件就已经存在了,固称为静态代理类。
可因代理对象需与目标对象实现一样的接口,会有很多代理类。一旦接口增加方法,目标对象与代理对象都要维护.代码会冗余。码农和经理都觉得很烦,什么事都要沟通一下再处理。
- 于是动态代理
动态代理
动态代理类的字节码在程序运行时由Java反射机制动态生成,无需码农手工编写它的源代码。动态代理类不仅简化了编程工作,且提高了软件系统的可扩展性,因Java反射机制可生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。
动态代理类
public class CoderDynamicProxy implements InvocationHandler { private ICoder coder; public CoderDynamicProxy(ICoder _coder){ this.coder = _coder; } //调用被代理的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("动态:"); Object result = method.invoke(coder, args); return result; } }
实现
public static void main(String args[]){ ICoder coder=new JavaCoder("xx码农"); //ICoder proxy=new CoderProxy(coder); //proxy.impldemand("add function1"); //创建中介类实例 InvocationHandler handler = new CoderDynamicProxy(coder); //获取类加载器 ClassLoader cl = coder.getClass().getClassLoader(); //动态产生一个代理类 ICoder proxy = (ICoder) Proxy.newProxyInstance(cl, coder.getClass().getInterfaces(), handler); //通过代理类,执行doSomething方法; proxy.impldemand("add function2"); }
结果如下
动态 xx码农 implemented function:add function2 in JAVA!阅读更多
相关文章推荐
- Java反射学习总结四(动态代理使用实例和内部原理解析)
- Java反射学习总结四(动态代理使用实例和内部原理解析)
- 解析Java中静态变量与实例变量的区别
- 实例解析Java中的synchronized关键字与线程安全问题
- 实例解析: java实现Windows 录音控制智能家居(一)
- Java网络编程实例---------------------------------Java HTTP代理程序
- Java动态代理实例
- Java中finally和return的关系实例解析
- Java编程时间日期API实例解析
- 解析Java中的Timer和TimerTask在Android中的用法和实例
- Java动态代理深度解析
- Java BufferedInputStream与BufferedOutputStream 入门版实例解析【文件操作】
- Java XML解析工具 dom4j介绍及使用实例
- 解析Java中静态变量与实例变量的区别
- JAVA动态代理实例
- Java爬虫(五)-- httpClient进阶:使用代理(详细解析)
- java设计模式-代理模式(实例讲解)
- Java动态代理机制的实例详解
- Java Web开发入门书籍实例解析(总结一)