Java反射机制
非常精彩的博客:JAVA反射与注解
什么叫反射?
反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
用一句话总结就是反射可以实现在运行时可以知道任意一个类的属性和方法。
下面说几个最长用的方法,如何来反射知道类的成员变量,方法以及构造函数。
获取类对象的方式:
Class c1 = Code.class; 这说明任何一个类都有一个隐含的静态成员变量class,这种方式是通过获取类的静态成员变量class得到的
Class c2 = code1.getClass(); code1是Code的一个对象,这种方式是通过一个类的对象的getClass()方法获得的
Class c3 = Class.forName("com.trigl.reflect.Code"); 这种方法是Class类调用forName方法,通过一个类的全量限定名获得
获取构造函数
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) // 获得该类的构造器,包括private的,不包括其父类的构造器 public Constructor<T> getConstructor(Class<?>... parameterTypes) // 获得该类的public构造器,包括父类,但是不包括private的 //具体 Constructor<?>[] allConstructors = class1.getDeclaredConstructors();//获取class对象的所有声明构造函数 Constructor<?>[] publicConstructors = class1.getConstructors();//获取class对象public构造函数 Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//获取指定声明构造函数 Constructor publicConstructor = class1.getConstructor(String.class);//获取指定声明的public构造函数
获取成员变量信息
public Field getDeclaredField(String name) // 获得该类自身声明的变量,包括private的,不包括其父类的变量 public Field getField(String name) // 获得该类的public成员变量,包括其父类变量,但是不包括private的, //具体实现 Field[] allFields = class1.getDeclaredFields();//获取class对象的所有属性 Field[] publicFields = class1.getFields();//获取class对象的public属性 Field ageField = class1.getDeclaredField("age");//获取class指定属性 Field desField = class1.getField("des");//获取class指定的public属性
获取成员方法信息:
public Method getDeclaredMethod(String name, Class<?>... parameterTypes) // 得到该类的方法,包括private的,但是不包括父类的 public Method getMethod(String name, Class<?>... parameterTypes) // 得到该类的public方法,包括父类的,但是不包括private的。 //具体使用 Method[] methods = class1.getDeclaredMethods();//获取class对象的所有声明方法 Method[] allMethods = class1.getMethods();//获取class对象的所有public方法 包括父类的方法 Method method = class1.getMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的public方法 Method declaredMethod = class1.getDeclaredMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的方法
不知道大家注意到没有:所有的getDeclaredXXX()可以获得所有的,包括private修饰的,但是不能获得父类的,而getXXX()可以获得所有的,包括父类的,但是被private修饰的是获取不到的。
此外还需要注意,当你用getDeclaredXXX()调用被private修饰的方法或变量或构造函数时,使用前,必须要.setAccessible(true)才可以使用。