您的位置:首页 > 编程语言 > Java开发

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即可完成代理的使用

四、远程代理的原理说明

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java