REF
https://juejin.im/post/5a44c0ad518825455f2f96e5
NOTE
反射机制是指在程序运行状态中,给定任意一个类,都可以获取到这个类的属性和方法
通过反射来…
操作类
类的构造函数是java.lang.reflect.Constructor类的对象
一般是通过如下方式
Class c1 = Test.class; 这说明任何一个类都有一个隐含的静态成员变量class,这种方式是通过获取类的静态成员变量class得到的
Class c2 = test.getClass(); test是Test类的一个对象,这种方式是通过一个类的对象的getClass()方法获得的
Class c3 = Class.forName("com.catchu.me.reflect.Test"); 这种方法是Class类调用forName方法,通过一个类的全量限定名获得
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) // 获得该类所有的构造器,不包括其父类的构造器
public Constructor<T> getConstructor(Class<?>... parameterTypes) // 获得该类所有public构造器,包括父类
// 强记: 多加一个declared 是获得更少的,仅仅有自己的那些构造器,包括private 的构造器
// 没有decalred 的就是获得自己部分的构造器(public 的) 以及 父类的public 的
操作 field
类的成员变量是java.lang.reflect.Field类的对象
Field field = personClass.getDeclaredField("name");
field.setAccessible(true); //因为变量name是私有的,需要在这里设置成可访问的
Object value = field.get(person);
System.out.println("获取的变量的值是:"+value);
//output:
获取的变量的值是:刘俊重
反射中可以通过:字段.get(对象),这也是获取对象的某个字段
操作method
类的成员方法是java.lang.reflect.Method的对象
public Method getDeclaredMethod(String name, Class<?>... parameterTypes) // 得到该类所有的方法,不包括父类的
public Method getMethod(String name, Class<?>... parameterTypes) // 得到该类所有的public方法,包括父类的
---
//下面是测试通过反射调用函数
//通过反射创建实例对象,默认调无参构造函数
Person person2 = personClass.newInstance();
//获取要调用的方法,要调用study方法,包含int和String参数,注意int和Integer在这有区别
Method method = personClass.getMethod("study", int.class, String.class);
Object o = method.invoke(person2, 18, "刘俊重");
===
注意此时就像上面获得某个字段的值 一样, 反过来用 ,,aka : 方法.invoke(哪个对象实例,方法参数1, 方法参数2)