Java反射
主要参考这篇文章
https://blog.csdn.net/sinat_38259539/article/details/71799078
什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射就是把java类中的各种成分映射成一个个的Java对象:
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象
类对象
每个类在第一次被调用时,都会被jvm创建类对象(因此只会有一个类对象),并加载到jvm内存.我们可以通过类对象来实现java反射的功能,即在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
怎么获取类对象?
三种方法:
Student stu = new Student("张三"); //第一种, 通过getClass()方法 Class clz1 = stu.getClass(); //第二种,通过class属性 Class clz2 = Student.class; //第三种,通过类的全名 Class clz3 = Class.forName("com.test.Student");
第一种 : 都有对象了,还要反射干什么
第二种 : 需要导包才能用,麻烦.
第三种 : 推荐使用
通过反射获取构造方法
public Constructor[] getConstructors() : 仅获取public的构造方法们
public Constructor[] getDeclaredConstructors() : 获取所有的构造方法们(public, protected, default, private)
public Constructor getConstructor(Class... parameterTypes) : 指定获取某个public构造方法,通过传入的参数类型的类对象确定
public Constructor getDeclaredConstructor(Class... parameterTypes) : 指定获取某个(4种权限)构造方法,通过传入的参数类型的类对象确定
Constructor-->newInstance(Object... initargs) : 用该构造函数创建对象,传如初始化参数.
获取成员变量
Field[] getFields() : 使用方法相似,不赘述
Field[] getDeclaredFields()
public Field getField(String fieldName) : 传入变量名来确定成员变量
public Field getDeclaredField(String fieldName)
Field --> public void set(Object obj,Object value) : 用Field对象调用set方法,形参1:赋值的对象, 形参2:赋的值 例 : fieldAge.set(person1, 22);
获取成员方法
public Method[] getMethods() : 不赘述
public Method[] getDeclaredMethods()
public Method getMethod(String name,Class<?>... parameterTypes) : 传入方法名以及方法参数的类对象们.
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
Method --> public Object invoke(Object obj,Object... args) : 参数1:要调用的方法的对象, 参数2:方法的参数们(形参)
其他
操作private属性或方法的前提 : 打开开关!(private属性或方法.setAccessible(true))
Constructor类, Field类, Metod类, Properties类等等的toString()方法都被重写过! 会打印出方法或属性的声明语句,而不是打印地址.
通过反射运行配置文件内容
看上边的链接
通过反射越过泛型检查
泛型会在类编译成class文件之后被擦除,所以你知道该怎么做了吧?
f