Java反射相关,占坑.
关于Class类和类的类型
类是java.lang.Class类的实例对象,而Class是所有类的类
由于Class的构造函数是私有的,所以如果想获取一个类,可以通过一个已有类得到Class的对象
Class c1 = Code.class;
这说明任何一个类都有一个隐含的静态成员变量class,这种方式是通过获取类的静态成员变量class得到的
Class c2 = code1.getClass();
code1是Code的一个对象,这种方式是通过一个类的对象的getClass()方法获得的
Class c3 = Class.forName("com.trigl.reflect.Code");
这种方法是Class类调用forName方法,通过一个类的全量限定名获得
Java反射相关的骚操作
- 获取成员方法Method
java.lang.reflect.Method;以下是Class对象获取方法的方法 public Method getDeclaredMethod(String name, Class<?>... parameterTypes) // 得到该类所有的方法,不包括父类的 public Method[] getDeclaredMethods(...) public Method getMethod(String name, Class<?>... parameterTypes) // 得到该类所有的public方法,包括父类的 public Method[] getMethods(...)实例:
Class c = Class.forName("com.reflect.Person"); //先生成class Object o = c.newInstance(); //newInstance可以初始化一个实例 Method method = c.getMethod("setNameAndId", String.class, int.class);//获取方法 method.invoke(o, "yumao", 10); //通过invoke调用该方法,参数第一个为实例对象,后面为具体参数值 - 获取成员变量Field
java.lang.reflect.Field;public Field getDeclaredField(String name) // 获得该类自身声明的所有变量,不包括其父类的变量 public Field[] getDeclaredFields(...) public Field getField(String name) // 获得该类自所有的public成员变量,包括其父类变量 public Field[] getFields(...)实例
Class c = a.getClass(); Field field = c.getDeclaredField("name"); Object o = c.newInstance(); Object msg = field.get(o); - 获取构造函数Constructor
java.lang.reflect.Constructor;public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) // 获得该类所有的构造器,不包括其父类的构造器 public Constructor<T>[] getDeclaredConstructors(...) public Constructor<T> getConstructor(Class<?>... parameterTypes) // 获得该类所以public构造器,包括父类 public Constructor<T>[] getConstructors(...)实例
// 构造函数 public A(String a, int b) { // code body } // 获取构造函数 Constructor constructor = a.getDeclaredConstructor(String.class, int.class);
