java反射
一.反射概念
在运行时,对于任何一个对象能获取到其类信息,任意一个类,都能够知道这个类的所以属性和方法,根据类信息,能构建其对象;
对于任意一个对象,都能调用它的任意一个(不管是否是私有的)方法和设置其任意一个(不管是否是私有的)属性;
这种动态获取信息、动态生成对象、及动态调用对象方法的功能叫Java的反射机制。
二.反射的作用
1.根据配置生成对应类的对象,提高可配置性,代码灵活性
2.即时编译(运行时根据需要生成java源代码,调用编译器编译的类,加载之后得到Class信息)后,通过反射,构造对象,调用方法,赋予了运行时代码能力增强
三.代码示例
java中反射相关类如下:
Java中主要由以下的类来实现Java反射机制(这些类都位于java.lang.reflect包中):
Class类:代表一个类。
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
Proxy类:动态代理工具类。
InvocationHandler接口:动态代理召唤接口。
Class类是Reflection API中的核心类,主要方法如下:
getName():获得类的完整名字。 getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。
getConstrutors():获得类的public类型的构造方法。
getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象
使用示例:
public Object copy(Object object) throws Exception{ //获得对象的类型 Class classType=object.getClass(); System.out.println("Class:"+classType.getName()); //通过Array(反射)创建数组 Object array = Array. newInstance( classType/*数组元素类型*/, 3/*数组长度*/); //通过Array(反射)设置数组元素 Array.set(array, 1, object); //通过Array(反射)获取数组元素 Array.get(array, 1/*数组下标*/); //通过Array(反射)获取数组元素长度 Array.getLength(array); //通过Array(反射)创建多维数组 Object array3 = Array. newInstance( classType/*数组元素类型*/, new int[]{5,10,7}/*3维数组每个维度的长度*/); /* *通过默认构造方法创建一个新的对象 *前一个{}中没内容,代表是获取无参构造函数,后一个{}中没内容,代表传的参数为空 */ Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{}); //获得对象的所有属性 Field fields[]=classType.getDeclaredFields(); for(int i=0; i<fields.length;i++){ Field field=fields[i]; String fieldName=field.getName(); String firstLetter=fieldName.substring(0,1).toUpperCase(); //获得和属性对应的getXXX()方法的名字 String getMethodName="get"+firstLetter+fieldName.substring(1); //获得和属性对应的setXXX()方法的名字 String setMethodName="set"+firstLetter+fieldName.substring(1); //获得和属性对应的getXXX()方法 Method getMethod=classType.getMethod(getMethodName,new Class[]{}); //获得和属性对应的setXXX()方法 Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()}); //调用原对象的getXXX()方法 Object value=getMethod.invoke(object,new Object[]{}); System.out.println(fieldName+":"+value); //调用拷贝对象的setXXX()方法 setMethod.invoke(objectCopy,new Object[]{value}); } return objectCopy; }