Java代理的相关知识
2014-05-18 18:33
197 查看
Java代理的概念:
自我总结:代理就是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。帮助理解:
代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
要为已经存在的 多个具有相同接口的 目标类的 各种方法 增加一些系统功能。例如:异常处理、日志、计算机方法的运行时间、事务管理、等等。
编写一个与目的类具有相同接口的代理类,代理类的每个方法调用目标类的方法,并在调用代码时加上一些系统功能的代码。
如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类、还是代理类,这样以后很容易切换,譬如,想要日志功能时就配置代理类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易。
代理的由来:
系统中存在交叉业务,一个交叉业务就是要切入到系统中的某一个方面,比如多个类的共方法
例如:需要达到这样的效果:运行某个方法,在可以得到方法应有返回值的同时,可以知道该方法运行的时间.
交叉业务的编程问题即为面向方面的编程(Aspect oriented program ,简称AOP),AOP的目标就是要使交叉业务模块化.
可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的
使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术.
Java代理的分类:
简单说是分为两种:动态代理和静态代理。
Java代理的运行机制:
既然称之为动态,那么其是在jvm运行过程中执行的;同时,代理就说明我们不能直接调用执行这个动作,而要通过一个中间事件来间接的执行这个动作.
Java动态代理是自jdk1.3引入的,位于java.lang.reflect.Proxy包下.其主要涉及到了Proxy类和InvocationHandler接口。通过jdk查看,我们发现Proxy类和InvocationHandler接口都不是很复杂,Proxy类有4个静态方法,其中的
publicstatic Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throwsIllegalArgumentException
方法是动态代理重要的方法;InvocationHandler接口只有一个方法,而这个方法则是动态代理的核心。Proxy类主要用来获取代理类的对象实例,InvocationHandler接口则主要完成了代理的过程。
示例说明
假设有一个Italk接口,有空的方法talk()(说话),所有的people对象都实现(implements)这个接口,实现talk()方法,前端有很多地方都将people实例化,执行talk方法,后来发现这些前端里有一些除了要说话以外还要唱歌(sing),那么我们既不能在Italk接口里增加sing()方法,又不能在每个前端都增加sing方法,我们只有增加一个代理类talkProxy,这个代理类里实现talk和sing方法,然后在需要sing方法的客户端调用代理类即可,代码如下:
建立接口:
package colorStudy; //接口类 public interface Italk { public void talk(String msg); }创建实体类:
package colorStudy; //实现类people public class People implements Italk { public String username; public String age; public String getName() { return username; } public void setName(String name) { this.username= name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public People(String name1, String age1) { this.username= name1; this.age = age1; } public void talk(String msg) { System.out.println(msg+":你好,我是"+username+",我年龄是"+age); } }创建代理类:
package colorStudy; //代理类TalkProxy public class TalkProxy implements Italk { Italk talker; public TalkProxy (Italk talker) { //super(); this.talker=talker; } public void talk(String msg) { talker.talk(msg); } public void talk(String msg,String singname) { talker.talk(msg); sing(singname); } private void sing(String singname){ System.out.println("唱歌:"+singname); } }
创建主方法:
package colorStudy; //应用端myProxyTest public class MyProxyTest { /**代理模式 * @param args */ public static void main(String[] args) { //不需要执行额外方法的 Italk people1=new People("好学生","25"); people1.talk("无代理的测试"); System.out.println("-----------------------------"); //需要执行额外方法的 TalkProxy talker=new TalkProxy(people1); talker.talk("有代理的测试","七里香"); } }
colorChen温馨提示:要用心的看例子才能有所得!!
引用文献:
http://baike.so.com/doc/6057034.html
http://blog.csdn.net/mamy010/article/details/7487369
http://blog.csdn.net/nottonmyself/article/details/18144407