1. 反射(概念):程序在运行期可以改变程序结构和变量类型,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
2. 反射的特性:
•在运行时判断任意一个对象所属的类
•在运行时构造任意一个类的对象
•在运行时判断任意一个类所具有的成员变量和方法
•在运行时调用任意一个对象的方法
3. 反射的前传:类类型 Class Class java中有一个类很特殊,就是Class类,大家就可以把它理解为封装了类的信息,很多解释说Class类没有构造器,其实是有的,
只不过它的构造方法是private的(构造函数设置成private,这样是为了禁止开发者去自己创建Class类的实例,就像单例模式中的构造方法一样要用private)。我们可以看一下JDK中源码:
class Class<T> implements java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement { private static final int ANNOTATION= 0x00002000; private static final int ENUM = 0x00004000; private static final int SYNTHETIC = 0x00001000; private static native void registerNatives(); static { registerNatives(); } /* * Constructor. Only the Java Virtual Machine creates Class * objects. */ private Class() {} .....
注释很明确的告诉了我们,这个类是有JVM来创建的,所以我们就不用麻烦了。如果我们拿到一个类的类型信息,就可以利用反射获取其各种成员以及方法了。 (注:Class 从JDK1.5版本后就开始更多为泛型服务了)那么我们怎么拿到一个类型的信息呢?假设我们有一个Monkey类:
4. 获取类的构造器
首先介绍一下Constructor类,这个类用来封装反射得到的构造器,Class有四个方法来获得Constructor对象
•public Constructor<?>[] getConstructors() 返回类中所有的public构造器集合,默认构造器的下标为0
•public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合
•public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有
•public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回任意指定的构造器 从名字来看,还是很好懂的,带上Declared的都是获得所有的构造方法,包括私有,哈,这下我们就可以调用原本不允许调用的私有构造器了,看代码
/** 2 * 获取构造方法Constructor
3 * getConstructor() only for public
4 * getDeclaredConstructor() global access all
5 *
6 * */
7
8 //指定参数列表获取特定的方法
9 Constructor con = cls1.getDeclaredConstructor(new Class[]{String.class});
10 con.setAccessible(true); //设置可访问的权限
11 Object obj = con.newInstance(new Object[]{"liyang"});
12 System.out.println(obj); //打印一下这个对象的信息
13
14 //获取所有的构造方法集合
15 Constructor con1[] = cls1.getDeclaredConstructors();
16 con1[1].setAccessible(true);
17 Object obj1 = con1[1].newInstance(new Object[]{"tom"});
18 System.out.println(obj1);
5. 获取类的成员变量
•public Field getDeclaredField(String name) 获取任意指定名字的成员
•public Field[] getDeclaredFields() 获取所有的成员变量
•public Field getField(String name) 获取任意public成员变量
•public Field[] getFields() 获取所有的public成员变量
/**2 * 获取成员变量Field
3 * getField()
4 * getDeclaredField()
5 * */
6 Field mem = cls1.getDeclaredField("name");
7 mem.setAccessible(true);
8 System.out.println("we get form field :"+mem.get(obj));
6. 获取类的方法
•public Method[] getMethods() 获取所有的共有方法的集合
•public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合
•public Method[] getDeclaredMethods() 获取所有的方法
•public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法
7.
本文引用: http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html
http://www.cnblogs.com/octobershiner/archive/2012/03/18/2404751.html