为何要写这篇博客
反射机制的用途非常多,比如获取方法,属性名和属性值等,甚至可以获取标签等标签属性。今天来比较几种获取实例化对象的属性值方法
数据准备
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class Student {
String name;
Integer ago;
Integer num;
String shcool;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAgo() {
return ago;
}
public void setAgo(Integer ago) {
this.ago = ago;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public String getShcool() {
return shcool;
}
public void setShcool(String shcool) {
this.shcool = shcool;
}
}
方法实践
Student student = Student.builder()
.name("小陈")
.ago(22)
.num(111111)
.shcool("hr")
.build();
// 第一种
Field[] declaredFields = student.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
String name = field.getName();
Object value = field.get(student);
System.out.println("属性" + name + "值为:" + value);
}
System.out.println("===================================================");
// 第二种 利用PropertyDescriptor 获取方法
Field[] declaredFieldV2s = student.getClass().getDeclaredFields();
for (Field field : declaredFieldV2s) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(),student.getClass());
Method readMethod = pd.getReadMethod();
Object invoke = readMethod.invoke(student);
System.out.println("方法" + readMethod.getName() + "值为:" + invoke);
Method writeMethod = pd.getWriteMethod();
}
System.out.println("===================================================");
// 第三种 有错误 会出现 Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
Method[] declaredFieldV3s = student.getClass().getMethods();
for (Method field : declaredFieldV3s) {
String name = field.getName();
Object invoke = field.invoke(student);
System.out.println("方法" + name + "值为:" + invoke);
}
运行截图:
总结
基于第一种来说,相对其他方式更为快捷,但是要属性为私有的情况下,需要开启field.setAccessible(true);才能获取,还有一个是,对于student对象来说,get()方法不能传null,不然会报空指针方式,所以要对student进行非空判断。
基于第二种来说,通过PropertyDescriptor的对象,可以获得get方法,这样就可以不考虑属性的私有权限。但是比较繁琐,还有好处是可以获得set方法进行赋值,但是也得注意类型,String是无法赋予int的,不然可以转换。
- 不推荐第三种,会报错。