一,初识反射
1.1概念:
在程序运行中,我们的每一个java文件都会被编译成class文件,class文件会被jvm加载进内存,jvm会解析class文件中的内容封装成一个class对象,将java类中的成员变量,成员方法,构造方法都封装成一个个对象,这些对象都保存在class对象的身上.我们反射要做的事情就是操作class对象身上的成员变量对象,成员方法对象,构造方法对象.
1.2 获取class对象的三种方式
1 @Test 2 public void testGetClass() throws ClassNotFoundException { 3 //1.通过Class对象的forName(全类名)静态方法获取;全类名=包名.类名 Class<Person> clazz1 = (Class<Person>) Class.forName("cn.itcast.domain.Person"); 4 //2.通过类名.class获取 Class<Person> clazz2 = Person.class; 5 //3.通过对象的getClass()方法获取 Person person = new Person(); Class<Person> clazz3 = (Class<Person>) person.getClass(); }
1.3 通过class对象获取成员变量,构造方法,成员方法
1.在以下列数的get方法中:尾部带 s的方法表示可以获取多个数据,不带 s的方法表示获取指定的数据,带Declared的方法表示获取任意类型数据,
不带Declared的方法则表示获取public修饰的成员/构造的方法.
1 * 获取功能: 2 1. 获取成员变量们 3 Field[] getFields() :获取所有public修饰的成员变量 4 Field getField(String name) 获取一个指定名称的public修饰的成员变量 5 6 Field[] getDeclaredFields() 获取所有的任意修饰符类型成员变量 7 Field getDeclaredField(String name) 获取任意修饰符类型指定名称的成员变量 8 9 2. 获取构造方法们 10 Constructor<?>[] getConstructors() 获取所有public修饰的构造方法 Constructor<T> getConstructor(Class<?>... parameterTypes) 获取指定参数类型的public类 型的构造 11 12 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取指定参数类型的 任意类型的构造 13 Constructor<?>[] getDeclaredConstructors() 获取任意类型所有的构造方法 14 3. 获取成员方法们: 15 Method[] getMethods() 获取所有public修饰的方法(可以获取父类的public修饰的方法) 16 Method getMethod(String name, Class<?>... parameterTypes) 获取一个指定名称指定参数类型 的public类型成员方法 17 18 Method[] getDeclaredMethods() 获取任意类型所有的成员方法 Method getDeclaredMethod(String Class, 类<?>... parameterTypes) 获取一个指定名称指定 参数类型的任意类型成员方法 19 20 4. 获取全类名/成员变量名称/成员方法名称/构造方法名称 21 String getName()
1.4 操作成员变量,构造方法,成员方法
0.暴力开启反射开关 (针对成员变量是非public修饰的 要在set/get之前设置)
field.setAccessible(true)
1.操作成员变量
field.get(Object obj) 表示获取哪个对象的field成员变量值 ;
field.set(Object obj,Object value) 表示设置obj对象的field成员变量的值为value;
2.操作构造方法 :创建对象
1 Object obj=constructor.newInstance(Object...param);创建对象,并且传递构造需要的参数 2 Object obj=Class对象.newInstance(); 执行的是空参构造
3.操作成员方法:调用方法
1 method.invoke(Object obj, Object... args);执行obj对象身上的method方法并给方法传递的参数值为args
二 .一张图带你了解反射原理
...