反射
定义:能够分析类信息的能力 ->得到类对象 (类里面所有的信息)
类信息:简单来说 属性,方法,构造器
类的活动周期👆 磁盘里的不会删除,内存里面用完就卸载了 通过反射前面三个阶段都是能够获取类信息的
获取一个类类对象的方法:1.知道类是在哪个路径上存放着Class.forName()是获取类信息的方法(Class是java里面的类对象的模板)2.通过类的 类.class属性也能得到类信息 3.类里每个对象里也提供一个方法叫 对象.getClass()
Class.forName(“类全名”):多用于配置文件,将类名定义在配置文件中然后读取文件,加载类
三种方法👆
类.class :多用于参数的传递
对象.getClass():多用于使用对象获取类对象
同一个类再一次程序运行过程中,只会被加载一次,一个类的类对象只会有一个,不管通过哪种方式获取到的类对象都是一样的
类对象常用功能
一丶构造方法
1.使用构造方法
获得构造方法对象 可以根据构造方法参数类型的不同,传入对应类型的类对象,即可获取指定构造方法 getConstructor()
创建对象 newInstance()
常规方法与反射方法对比👇获取的东西是一样的但是反射方法更具灵活性因为如果用在其他场景下只需要改变他的传参但是常规方法需要改变的地方非常多
有参数的反射构造方法和普通new对象的对比👇
如果使用无参构造方法,此操作可以简化直接使用 类对象.newInstance()来创建对象👇
2.获取所有构造方法(获取一个数组)
获取所有构造方法 getConstructors() 获取了所有然后遍历看看到底有什么类型再决定调用,常用于不知道有什么类型的参数情况下。
获取所有的指定包含公公和非公共getConstructor()
二丶获取成员变量
1.获取指定公共成员变量 getField();可以根据成员变量名称指定获取需要加参数
设置值 set(Object obj,Object value) 一个对象一个对象的值
获取值 get(Object obj)
纯反射👇
2.获取所有公共成员变量 getFields();不需要加参数需要通过数组 👇
3.获取非公共所有成员变量 getDelaredFields()👇
4.获取指定成员变量getDelaredField()调用set之前需要加一句👇暴力反射
非公共成员变量需要使用setAccessible();代表暴力反射
三丶方法
1.获取指定公共方法对象 getMethod();可以根据方法名称以及参数类型对应的类对象指定获取需要加参数👇有参数就写没参数就把后面东西干掉
调用 invoke(Object object,Object....args) 开辟了空间参数是可变(args)
获取值 get(Object obj)
2.获取所有公共方法对象 getMethods();不需要加参数需要通过数组 有参数就写没参数就把后面东西干掉👇
3.获取所有方法对象 getDelaredMethods()👇
4.获取指定方法对象getDelaredMethod()调用set之前需要加一句👇暴力反射
以此类推反射不只有这几种还有更多的方法