java反射
上面的就是java反射的作用
这里的我们在本地自己写一个类来进行测试
Person.java
1 | import java.io.FileInputStream; |
然后在定义一个reflect类来测试,就是在这个reflect类里边进行反射调试
在这个类里边,getClass()是得到person对象的Class
反射的实质就是操控Class
这里从class里面实例化对象,方便含有无参和有参的方法
里面的直接使用c.newInstance();
是调用Person类里边的无参构造函数
使用下面这个代码的话是调用Person类里边的有参构造方法,在c.getConstructor(String.class,int.class);
里边的参数,是根据Person类里边设置好的参数来进行填写,因为Person类里边的构造函数是(string,int),
所以这里就这样填c.getConstructor(String.class,int.class);
最后直接在Person person1 =(Person) constructor.newInstance("tom",12);
里边输入值,然后使用S.o.p输出就行了
1 | Constructor constructor = c.getConstructor(String.class,int.class); |
获取类里面属性
person类里边只有两个属性,一个公开的name,和一个私有的age
getField()方法就是获取属性的方法,属于Field这个类,但是getField()方法只能获取公开属性的方法,私有属性的使用另一个方法,下面会继续讲
这里代码的意思是,先获取person类里边的属性用数组装起来,然后用for循环进行输出
getDeclaredFields();方法就是可以访问私有和公有属性的,其他函数种只要含有Declared的,都是可以访问私有的
可以获取类里边的属性了,那么我们就可以尝试修改一下这些属性的值了
这就是修改前后的样子
代码是先获取到person类里边的属性,并确定要修改哪一个属性,这里写的是getField(),没有在末尾加上s,那么没加s的就是可以进行传参来确定要修改的值的,这里传的参数是name,那么我们就可以进行name属性值的修改,然后使用set()方法来确定修改谁的,修改成啥内容,这里添加的对象必须是实例化后的对像,所以是person1
上面的代码是修改不了私有属性的
成功进行修改,这里修改的关键就是这两行代码
1 | Field field = c.getDeclaredField("age"); |
其他代码的解释和上面说的一样
接下来是调用类里边的方法
还是和上面那个获取属性的方法一样,使用末尾加s的函数,利用数组来存贮,然后使用for循环输出
他这里获取的方法有person里边的,还有Object对象的,因为所有的类都继承于他,他是个底层类
接下来我们换一种写法,不使用数组的写法
就是这两个简单的代码,然后就可以访问person类里边的函数方法了,这里的getMethod()方法和那个getConstructor()方法类似,都是必须得告诉一下我们使用的是啥类型的参数。这里的invoke()方法在这里就是触发的意思,就是触发person里边的action方法,这里传的参数和上面的set()是一个意思,就是第一位得传实例化的对象,然后第二位传参数(可以在输出函数名的时候进行查看,idea会告诉你该传什么参数)
接下来就是调用私有方法
这里话是把getMethod换成了getDeclaredMethod,然后加一个可以进行修改的权限,method.setAccessible(true);
reflect.java
1 | package org.example; |
以上就是全部java反射的学习过程了