简介
主要是两个类 Introspector
和 PropertyDescriptor
BeanInfo beanInfo = Introspector.getBeanInfo(vo.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors() // 只有这个方法
// or
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fieldName, vo.getClass());
// 最终都是
Method readMethod = propertyDescriptor.getReadMethod();
Method writeMethod = propertyDescriptor.getWriteMethod();
writeMethod.invoke(vo,"hahah");
System.out.println(readMethod.invoke(vo));
详细示例
public void information(SomethingVO vo) {
// 方式1
BeanInfo beanInfo = Introspector.getBeanInfo(vo.getClass());
for(PropertyDescriptor property: beanInfo.getPropertyDescriptors()){
Method getMethod = property.getReadMethod(); // 获得get方法
getMethod.invoke(vo); // 执行方法
Method setMethod = property.getWriteMethod(); // 获得set方法
setMethod.invoke(vo,"各个参数"); // 执行set方法, 后面带参数
}
// 方式2
Field[] declaredFields = vo.getClass().getDeclaredFields();
for (Field field:declaredFields){
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), vo.getClass());
Method getMethod = propertyDescriptor.getReadMethod(); // 获得get方法
getMethod.invoke(vo); // 执行方法
Method setMethod = propertyDescriptor.getWriteMethod(); // 获得set方法
setMethod.invoke(vo,"各个参数"); // 执行set方法, 后面带参数
}
// 方式2,可以单独获取某一个字段,比如name字段
PropertyDescriptor name = new PropertyDescriptor("name", vo.getClass());
Method readMethod = name.getReadMethod();
Method writeMethod = name.getWriteMethod();
writeMethod.invoke(vo,"hahah");
System.out.println(readMethod.invoke(vo));
}
设置 JavaBean 通过 getter / setter
来对属性进行操作,主要是因为当字段名更改,字段读写方式(过程)更改了,能向后兼容;如果使用Object.field的方式不便于维护。
注意⚠️:对应实体类必须遵循Bean原则,如果set方法返回的this对象而不是void,执行时就会抛出异常java.beans.IntrospectionException: Method not found: setName