java的动态代理学习总结
2012-04-22 20:11
405 查看
1,摘要
Java动态代理是java的一个重要的概念.虽然其默默无闻,不被初学者所熟知,但其如同Java反射机制一样,使java丰富多彩.
首先,为什么我们需要java的动态代理呢.java的代理有两种,分别是静态代理和动态代理,静态代理不是很实用,这里也就不详细的说了.说到动态代理,我们对’动态’一定感到很亲切,不错,在前面已经讨论了Java的反射机制,那么它和java反射机制有什么联系呢.java动态代理正是依靠java反射机制提供的动态能力.如此,我们不妨假想一下:我们需要动态的运行一个类中的方法,但这个方法在运行之前和运行之后可能需要一些辅助动作,比如,该方法运行之前需要一些数据的准备等等.那么这时动态代理就派上大的用场了.
2,机制分析
既然称之为动态,那么其是在jvm运行过程中执行的;同时,代理就说明我们不能直接调用执行这个动作,而要通过一个中间事件来间接的执行这个动作.
Java动态代理是自jdk1.3引入的,位于java.lang.reflect.Proxy包下.其主要涉及到了Proxy类和InvocationHandler接口。通过jdk查看,我们发现Proxy类和InvocationHandler接口都不是很复杂,Proxy类有4个静态方法,其中的
publicstatic
Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws
IllegalArgumentException
方法是动态代理重要的方法;InvocationHandler接口只有一个方法,而这个方法则是动态代理的核心。Proxy类主要用来获取代理类的对象实例,InvocationHandler接口则主要完成了代理的过程。
下面将通过代码来解释动态代理的过程。
3,实例展现
4,结语
Java动态代理似乎与面向切面编程很像,由于对AOP还没有进行学习,因而对动态代理的应用的理解还是肤浅的。同时其又是神秘的,比如newProxyInstance方法,它是怎么使获得的代理能执行InvocationHandler接口中的invoke方法还没有进行深入的研究(借此推荐一篇文章,是关于动态代理源代码层面分析的. http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/)。这都是需要进行进一步的学习。
Java动态代理是java的一个重要的概念.虽然其默默无闻,不被初学者所熟知,但其如同Java反射机制一样,使java丰富多彩.
首先,为什么我们需要java的动态代理呢.java的代理有两种,分别是静态代理和动态代理,静态代理不是很实用,这里也就不详细的说了.说到动态代理,我们对’动态’一定感到很亲切,不错,在前面已经讨论了Java的反射机制,那么它和java反射机制有什么联系呢.java动态代理正是依靠java反射机制提供的动态能力.如此,我们不妨假想一下:我们需要动态的运行一个类中的方法,但这个方法在运行之前和运行之后可能需要一些辅助动作,比如,该方法运行之前需要一些数据的准备等等.那么这时动态代理就派上大的用场了.
2,机制分析
既然称之为动态,那么其是在jvm运行过程中执行的;同时,代理就说明我们不能直接调用执行这个动作,而要通过一个中间事件来间接的执行这个动作.
Java动态代理是自jdk1.3引入的,位于java.lang.reflect.Proxy包下.其主要涉及到了Proxy类和InvocationHandler接口。通过jdk查看,我们发现Proxy类和InvocationHandler接口都不是很复杂,Proxy类有4个静态方法,其中的
publicstatic
Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws
IllegalArgumentException
方法是动态代理重要的方法;InvocationHandler接口只有一个方法,而这个方法则是动态代理的核心。Proxy类主要用来获取代理类的对象实例,InvocationHandler接口则主要完成了代理的过程。
下面将通过代码来解释动态代理的过程。
3,实例展现
package proxy; /** * real class interface * 一个普通的接口,里面有两个方法。 */ publicinterface IUserProxy { publicvoid save(String name,String password); publicvoid remove(String name); } |
package proxy; /** * 该接口的一个实现。 * */ publicclass UserProxyImpl implements IUserProxy{ publicvoid save(String name, String password) { System.out.println("hello,"+name+",your info saved"); } publicvoid remove(String name) { System.out.println("hello,"+name+",your info removed"); } } |
package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 动态代理类,注意该类实现了InvocationHandler接口,这是动态代理类必须实现的接口。 * */ public class UserProxy implements InvocationHandler{ private Object proxy; //通过代理类的构造函数,将委托类的对象传进来 public UserProxy(Object proxy){ this.proxy = proxy; } //实现了InvocationHandler接口的唯一的方法。 public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { //在执行委托类方法前,可以执行一些其他的动作。 System.out.println("the method name is:"+method.getName()); //执行委托类的方法, method.invoke(this.proxy, args); //在执行委托类方法后,可以执行一些动作。 System.out.println("the method invoked"); return null; } } |
package proxy; import java.lang.reflect.Proxy; /** *测试动态代理 * */ publicclass TestProxy { publicstaticvoid main(String[] args){ IUserProxy user = new UserProxyImpl(); UserProxy proxy = new UserProxy(user); //获取一个代理,其中用到了java反射机制 IUserProxy userproxy = (IUserProxy)Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), proxy); //执行该方法其实是执行了UserProxy类中的public Object invoke(Object proxy, Method method, Object[] args)throws Throwable方法。 userproxy.save("test", "12345"); userproxy.remove("test"); } } |
Java动态代理似乎与面向切面编程很像,由于对AOP还没有进行学习,因而对动态代理的应用的理解还是肤浅的。同时其又是神秘的,比如newProxyInstance方法,它是怎么使获得的代理能执行InvocationHandler接口中的invoke方法还没有进行深入的研究(借此推荐一篇文章,是关于动态代理源代码层面分析的. http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/)。这都是需要进行进一步的学习。
相关文章推荐
- Java反射学习总结四(动态代理使用实例和内部原理解析)
- Java基础学习总结——动态代理技术(Proxy)
- Java反射学习总结四(动态代理使用实例和内部原理解析)
- 反射和动态代理之Java学习总结
- Java基础学习总结(109)——Jdk动态代理和cglib动态代理总结
- java 动态代理学习(Proxy,InvocationHandler)
- java学习笔记之动态代理
- java学习笔记之动态代理
- Java学习:动态代理
- java动态代理学习笔记
- java静态和动态代理学习笔记
- Java动态代理Proxy学习
- Java设计模式学习06——静态代理与动态代理
- Java设计模式学习06——静态代理与动态代理
- Java学习笔记之动态代理
- JAVA学习--反射之动态代理模式
- 学习Spring必学的Java基础知识(2)----动态代理
- java动态代理学习笔记
- 关于jdk动态代理+proxy参数作用的学习总结
- Spring学习总结——静态代理、JDK与CGLIB动态代理、AOP+IoC