反射--java进阶day18

1.反射

字节码文件包含了类的所有属性和方法

反射就是获取到类的字节码对象,然后通过字节码对象反向获取到该类的所有属性对象和方法对象,再通过这些对象使用属性和方法

2.获取类的字节码对象

如图

类的字节码只有一份,所以类的字节码对象也只有一份

3.反射类中的构造方法

通过字节码文件调用,分为反射所有构造方法和反射指定构造方法

其中带有Declared的方法称为暴力反射,它可以反射私有化的方法,未带有Declared只能反射public修饰的方法

[1]反射指定构造方法

在反射指定构造方法时,括号里给的是构造方法的参数,通过给的参数来确定我们反射的是哪个构造方法(不给则为空参构造)

括号里要的是字节码(Class),所以我们给参数的时候也要给参数的字节码形式(void也有字节码形式)

如果代码报错,观察一下是否因为权限不够导导致无法反射,改为Declared的暴力反射即可

[2]实例化操作

通过反射的构造方法,进行实例化操作

1.newInstance

根据反射的构造方法创建对象,当我们反射的是有参构造时,就要给创建的对象参数,否则报错

2.setAccessible

使用暴力反射获取到的构造方法权限不够,需要调用该方法取消访问权限,才能使用(控制台是还未取消权限时爆出的异常)

4.反射类中的成员变量

反射多个成员变量时,返回值是一个数组

反射单个成员变量时,括号里给的是要反射的成员变量的名称

因为使用的是暴力反射,如果要进行后续的使用需要打开权限

反射的成员变量的赋值和获取

[1]set

使用反射的成员变量调用该方法

第一个参数为对象,第二个参数为要赋的值

因为类可以创建很多的对象,所以要确定是哪个对象的变量


使用反射获取构造方法创建对象,而不是直接创建对象,直接创建就失去了反射的意义

[2]get

参数为对象,根据指定的对象,获取到对象对应的成员变量的值

使用反射得到的成员变量调用

5.反射类的成员方法

getMehods不仅可以反射我们写的方法,继承的方法也可以反射到(public修饰的)

反射多个成员方法对象

[1]反射指定的单个成员方法对象

第一个参数是方法名,第二个为方法的形参,根据给定的形参确定反射哪个方法

因为成员方法具有重载,所以要根据给定的形参来确定反射哪个成员方法

[2]执行反射的成员方法对象

通过反射到成员方法调用,第一个参数是对象,第二个参数是方法的实参

第一个参数,确定哪个对象调用eatMethod(反射的成员方法),第二个参数给出实参

案例一

java的泛型是伪泛型,只在编译的时候有效,字节码里没有泛型,我们获取字节码对象,反射add,在add执行时塞入String字符串即可

add方法在未添加泛型时,默认类型是object,可以添加任意类型的变量,所以在执行反射的add时,第二个参数给object的字节码

案例二

先将三个类写好,然后在配置文件中写学生类的信息


接着使用类加载器加载配置文件,将数据加载进Properties集合中

接着使用键找值取出数据

获取类的字节码对象,反射构造方法对象和成员方法对象,生成对象并执行方法即可

之后我们只需要修改配置文件里的字符串,就可以更改对应的代码,非常灵活

posted @ 2025-05-31 14:21  直実  阅读(13)  评论(0)    收藏  举报