大家好!这篇文章也是关于反射机制中的问题,具体是关于Field(字段)的一些简单问题,写的不足之处,还请大家多多指教。同时,小芳还想再次说明,文章针对于对Java语言有一定基础的小伙伴!请见谅!
首先,写一个普通的pojo,注意里面成员的修饰符,有使用private和public修饰的成员
package com.mec.about_reflection;
public class PersonClass {
//注意name前面有public修饰
public String name;
//注意这两个成员前有private修饰
private int age;
private String sex;
public PersonClass() {
}
public PersonClass(String name, int age, String sex) {
super();
this.setName(name);
this.setAge(age);
this.setSex(sex);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "PersonClass [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
接下来,我在main()函数获取上面的类的字段成员,代码如下:
package com.mec.about_reflection.field;
import java.lang.reflect.Field;
import com.mec.about_reflection.PersonClass;
public class AboutField {
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
//通过反射机制获取想要获得字段成员的这个类
Object object = new PersonClass();
Class clazz = object.getClass();
//取出这个类的字段成员,注意getDeclaredFields()方法获取的还包括这个类中用private修饰的字段成员,而且获取得一般都是数组
Field[] fields = clazz.getDeclaredFields();
//遍历这个类中的所有字段成员,并输出
for(Field field : fields) {
System.out.println("字段成员:" + field.getName());
//输出结果为:
字段成员:name
字段成员:age
字段成员:sex
}
//获取这个类中的指定字段成员,此时获取的为私有成员(用private修饰)
Field fieldOne = clazz.getDeclaredField("age");
System.out.println("获取指定对象成员名称:" + fieldOne.getName());
//输出结果:获取指定对象成员名称:age
//因为这个类的‘age’成员是被private修饰,所以设置它的可见性
fieldOne.setAccessible(true);
//给该类创建一个对象,并传参数
PersonClass personClass = new PersonClass("芳芳",108,"女");
try {
//通过这个类的对象获取指定字段成员的值,注意此时获取的是age的值
Object objectOne = fieldOne.get(personClass);
System.out.println("获取指定对象字段‘age’的field的值:" + objectOne);
//输出结果:获取指定对象字段‘age’的field的值:108
//设置这个成员的值,这里注意这个方法的参数,第一个参数是该类一个对象
fieldOne.set(personClass, 88);
//对于私有成员,不能直接通过点来获取它的输出值,在这里可以用get方法输出,对于public修饰的成员可以直接通过点来输出它的值
System.out.println("设定指定对象字段‘age’的field的值:" + personClass.getAge());
//输出结果为:设定指定对象字段‘age’的field的值:88
//System.exit(0);这一行是为了避免一串大写的红色的错误而写的,今天在这句话之后我也写了输出,但是都没有再输出,它有阻断后续程序执行的作用(我猜测)
//获取公共字段成员属性(用public修饰)
Field fieldTwo = clazz.getDeclaredField("name");
System.out.println("输出fieldTwo:" + fieldTwo);
//输出结果:输出fieldTwo:public java.lang.String com.mec.about_reflection.PersonClass.name
System.out.println("获取指定名称的field成员:" + fieldTwo.getName());
//输出结果:获取指定名称的field成员:name
//给这个类创建一个实例
PersonClass personClassTwo = new PersonClass("远远",22,"男");
//获取此实例中指定名称的字段成员的值
Object objectTwo = fieldTwo.get(personClassTwo);
System.out.println("得到指定对象的‘name’的field的值:" + objectTwo);
//输出结果:得到指定对象的‘name’的field的值:远远
//设置这个成员中指定字段成员的值
fieldTwo.set(personClassTwo, "静静");
System.out.println("设定含有public修饰的成员‘name’:" + personClassTwo.name);
//输出结果:设定含有public修饰的成员‘name’:静静
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
看完了代码,在这里我主要还想总结两点:
1.对于一个类的私有字段成员我们也可以获取它的值,例如小芳的这篇文章中的age成员,它是由private修饰的,但是我们依旧可以对它进行获取和更改,做这些的前提是对这个field设置setAccessible()方法,而且,在获取这个成员的值时,不能直接用对象点方法(object.field),而是要用它的get方法。而对于一个public修饰的字段成员,无需设置setAccessible()方法就可对其进行获取与更改,在获取值时也可以直接使用对象点方法来获取;
2.注意前后逻辑关系,自行体会。
好的,谢谢你看到这里!晚安!
你要去相信,没有到不了的明天!