java反射与动态代理
2014-06-27 18:56
295 查看
一、反射
1 基本概念:动态获取类的信息,动态调用对象的方法
a 在运行时判定任一对象所属的类
b 在运行时构造任一类的对象:(如servlet容器通过反射来初始化对应的servlet)
c 在运行时判定任一类所具有的成员变量和方法
d 在运行时调用任一对象的方法
e 生成动态代理
2 主要类:
Class:代表一个类
Field:代表类的成员变量(类的属性)
Method:代表类的方法
Constructor:代表类的构造方法
Array:提供了动态创建数组,一级访问数组元素的静态方法
3 Class类的方法:
getName()
getFields()
getMethods()
4:通过反射创建对象的方法:
Class classType = Class.forName("className");
classType.newInstance();
二、代理
1 基本概念
就是在调用实现类的方法时,可在方法的执行前后做额外的工作。
代理类:主要负责为委托类预处理消息,过滤消息,吧消息转发给委托类,以及事后处理消息等。代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,提供特定的服务。
如远程方法调用,权限控制,对开销较大资源的访问控制等
静态代理类:在程序运行前,代理类的.class文件已经存在
动态代理类:在程序运行时,运用反射来动态创建生成。动态代理类的字节码在程序运行时由java反射机制动态生成,无需程序员手动编写它的源代码,从而简化了编程,提高扩展性
三、使用java实现动态代理的方法
1 定义一个被代理类的接口,如PersonBean
2 定义一个完成具体功能的被代理类,如PersonBeanImpl implements PersonBean
3 定义一个InvocationHandler接口的实现类,如OwnerInvocationHandler,并实现其invoke(Object proxy,Method method,Object[] args)方法,则任何通过代理类Proxy的请求调用都会调用OwnerInvocationHandler的invoke方法来完成相应功能。
4 创建Proxy并实例化Proxy对象:使用Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHandler)来创建一个代理类的实例,如
PersonBean proxyBean = (PersonBean)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new OwnerInvocationHandler(person)); 其中person是一个具体的被代理类PersonBeanImpl实例
5 调用proxyBean即可完成代理的使用
四、远程代理的原理说明
1 基本概念:动态获取类的信息,动态调用对象的方法
a 在运行时判定任一对象所属的类
b 在运行时构造任一类的对象:(如servlet容器通过反射来初始化对应的servlet)
c 在运行时判定任一类所具有的成员变量和方法
d 在运行时调用任一对象的方法
e 生成动态代理
2 主要类:
Class:代表一个类
Field:代表类的成员变量(类的属性)
Method:代表类的方法
Constructor:代表类的构造方法
Array:提供了动态创建数组,一级访问数组元素的静态方法
3 Class类的方法:
getName()
getFields()
getMethods()
4:通过反射创建对象的方法:
Class classType = Class.forName("className");
classType.newInstance();
二、代理
1 基本概念
就是在调用实现类的方法时,可在方法的执行前后做额外的工作。
代理类:主要负责为委托类预处理消息,过滤消息,吧消息转发给委托类,以及事后处理消息等。代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,提供特定的服务。
如远程方法调用,权限控制,对开销较大资源的访问控制等
静态代理类:在程序运行前,代理类的.class文件已经存在
动态代理类:在程序运行时,运用反射来动态创建生成。动态代理类的字节码在程序运行时由java反射机制动态生成,无需程序员手动编写它的源代码,从而简化了编程,提高扩展性
三、使用java实现动态代理的方法
1 定义一个被代理类的接口,如PersonBean
2 定义一个完成具体功能的被代理类,如PersonBeanImpl implements PersonBean
3 定义一个InvocationHandler接口的实现类,如OwnerInvocationHandler,并实现其invoke(Object proxy,Method method,Object[] args)方法,则任何通过代理类Proxy的请求调用都会调用OwnerInvocationHandler的invoke方法来完成相应功能。
4 创建Proxy并实例化Proxy对象:使用Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHandler)来创建一个代理类的实例,如
PersonBean proxyBean = (PersonBean)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new OwnerInvocationHandler(person)); 其中person是一个具体的被代理类PersonBeanImpl实例
5 调用proxyBean即可完成代理的使用
四、远程代理的原理说明
相关文章推荐
- 【转】java的反射机制中的动态代理代理(一)--简介
- java的动态代理和反射
- 【转】JAVA核心层--反射--动态代理
- Java反射学习总结四(动态代理使用实例和内部原理解析)
- Java反射那点事(二)动态代理
- 【转】java的反射机制中的动态代理代理(二)--在远程方法调用中运用代理类
- Java反射之JDK动态代理实现简单AOP
- ——Java反射与动态代理
- java学习笔记---类型信息(type information)、反射机制与动态代理
- java利用反射实现动态代理示例
- Java反射和动态代理
- java、反射和动态代理
- Java深度历险——Java反射与动态代理
- 反射和动态代理之Java学习总结
- JAVA核心层--反射--动态代理
- JAVA核心层--反射--动态代理
- 模拟实现Struts拦截器-蕴含着代理模式,AOP,工厂模式,依赖注入,Java 反射,动态构造等机制
- java基础加强(反射、内省、BeanUtils工具类、类加载器、动态代理)
- 07 Java反射/动态代理
- java类初始化/生命周期及反射及动态代理