java反射
之前的博客java反射讲了有关java反射的基础知识:什么是java发射,如何获取Class对象,如何获取到Class对象的属性、方法和构造方法等。
今天的博客主要有关如何操作属性、方法、构造方法
我们直接进入主题:要想操作一个类的属性,我们能想到的就是你得获得这个属性,那么前提是你获得了这个Class对象,不然一切都是空谈,现在我们先获得这个Class对象。(三种方法的任意一种)下面我先给出我们要操作的类。
public class Person{
public String name;
private int age;
//我给里面写了一个输出的方法,一会方便我们操作的时候来输出
public void print(){
System.out.println("name:"+name+"age:"+age);
}
}
先来获取类的Class对象吧
//我们获取了Person类的类对象clazz
Class clazz= class.forName(reflect.Person);
接下来就可以获取到属性,然后操作属性(注意我们要操作属性、方法等我们都需要先创建出这个对象)
//使用Person类对象clazz的无参构造方法来创建了一个对象。
Person per = (Person)clazz.getnewInstance();
Field f = clazz.getField("name");//获取到属性name
int ff = f.getModifiers();//这个方法是获得属性的特征修饰,这个方法的返回值是int类型的,这里随意的加了一个拓展,大家可以忽略。
//操作属性 向里面存值
//set(对象,值)————从这个属性的set方法,我们可以知道,他套操作属性,我们需要知道属性要操作的Class类对象是谁,现在也就解释了之前 我们要调用getnewInstance方法来创建Person对象的原因(其实创建对象的原因不止这些,但是这里也能反映一些)
f.set(per,"小白");
per.print();//调用了peeson的print方法输出和属性的值,输出结果在下面啊
//操作属性 从里面取值
//get(对象)
f.get(per);
输出:
如上是利用反射怎么操作属性的,不论属性是共有还是私有的,我们通过反射都可以获取到,但是如果属性是私有的,我们不可以直接操作,而是要通过设置,但是这个方法通常是不推荐使用的,不安全
Field fa = clazz.getDeclaredField("age");//获取到私有属性age
//不能直接操作,我们要通过设置
fa.setAccessible(true);
fa.set(per,18);