java语言的反射机制

在java运行时环境,对于任何一个类,可以知道这个类有哪些方法和属性。

对于任何一个对象,可以调用它的任何一个方法。

动态获取类的信息,动态调用对象的方法的功能源于java的反射机制。

java反射机制主要提供了以下功能:

1.运行时判断任何一个对象所属的类。

2.运行时构造任何一个类的对象。

3.运行时判断任何一个类所具有的成员变量和方法。

4.运行时调用任何一个对象的方法。

5.生成动态代理。

 

发射相关的类和包:

java.lang.reflect

Class,Field,Method,Construtor,Array

 

java.lang.Class类

getName()  获得类的完整名字

getFields() 获得类的public属性

getDeclaredFields()  获得所有属性

getMethods()  获得方法

getDeclaredMethods()  获得所有方法

getMethod(String name,Class [] parameterTypes) 根据方法名字和参数序列类型,获得方法

getConstrutors() 获得public的构造方法

getConstrutor(Class [] parameterTypes) 根据参数类型序列获得构造方法

getComponentType()  表示数组组件类型的Class

newInstance() 通过类的不带参数的构造方法,创建一个类的实例

 

1.通过默认构造方法创建一个新的对象

Object objCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});

 

2.方法调用

Object method.invoke(Object obj,Object .. obj)

 

3.创建数组

Array.newInstance(classType,size);

 

应用:远程方法调用

代理模式

代理类和委托类实现了相同的接口

代理类负责为委托类预处理消息,过滤消息,把消息传给委托类,后处理。

代理类和委托类存在关联关系,代理类的对象并不真正实现服务,而是通过调用委托类的相关联的方法,来提供特定的服务。

按照代理类的创建时期,分为两种:

静态代理类:由程序员或者特定工具自动生成源代码,再对其进行编译。在程序运行前,代理类的class文件就已经存在。

动态代理类:在程序运行的时候,运用反射机制动态创建而成。

 

动态代理相关的包和类:

java.lang.reflect

Proxy和InvocationHandler

Proxy提供了静态方法负责创建动态代理类及其实例的方法:

1.public static Class<?> getProxyClass(ClassLoader loader,Class<?>[]interfaces)  创建动态代理类

loader类加载器

interfaces 动态代理类需要实现的所有接口

2.public static Object  newProxyInstance(ClassLoader loader,Class<?>[]interfaces,InvocationHandler handler) throws IllegalArgumentException

创建动态代理类的实例

 

Proxy类的静态方法创建的动态代理类具有以下特点:

1.动态代理类是public,final和非抽象类型的。

2.动态代理类继承了java.lang.reflect.Proxy类。

3.动态代理类的名字以$Proxy开头。

4.动态代理类实现了getProxyClass()和newProxyInstance()方法参数interfaces指定的所有接口。

5.Proxy类的isProxyClass(Class<?> cl)静态方法可以用来判断参数指定的类是否为动态代理类。只有通过Proxy创建的类才是动态代理类。

6.动态代理类都有一个public类型的构造方法,该构造方法有一个InvocationHandler类型的参数。

 

Proxy类的静态方法创建的动态代理类的实例具有以下特点:

1.假定变量foo是一个动态代理类的实例,并且这个动态代理类还实现了Foo接口,那么"foo instanceof Foo"的值为true。

把foo强制转换为Foo类型是合法的,(Foo)foo。

2.每一个动态代理类都和一个InvocationHandler实例相关。Proxy类的静态方法getInvocationHandler(Object proxy)返回这个InvocationHandler实例。

3.假定Foo接口只有一个方法,那么当程序调用动态代理类实例foo的amethod()方法时,该方法会调用与它相关联的InvocationHandler对象的invoke()方法。

 

InvocationHandler接口

Object invoke(Object proxy,Method method,Object [] params) throws throwable;

 

posted @ 2014-03-23 13:47  qiumiaod  阅读(180)  评论(0编辑  收藏  举报