一、获取属性或值并赋值(两种方式)
1、方式一
try {
// 获取当前对象(object)的类
Class clazz = object.getClass();
// 获取指定属性值
Object state = new PropertyDescriptor("name", clazz).getReadMethod().invoke(object);
// 执行 set 方法
Method method = clazz.getSuperclass().getMethod("setName", String.class);
method.invoke(object, "倔强男孩儿");
} catch (IntrospectionException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
2、方式二
// 1. 获取当前对象的所有属性
Field[] fields = object.getClass().getDeclaredFields();
// 2. 遍历所有属性
for (Field field : fields) {
try {
// 设置可以访问私有变量的值
field.setAccessible(true);
// 打印属性/属性值
System.out.println("属性:" + field.getName() + " -> 值:" + field.get(object));
// 编辑 set 方法,驼峰命名
String methodName = "set" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
// 执行 set 方法
Method method = object.getClass().getMethod(methodName, String.class);
method.invoke(object, "倔强男孩儿");
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
}
二、List转换Map
List<Object> list = new ArrayList<>();
for (Object obj : list) {
Map<String, Object> map = new HashMap<>();
// 获取所有public方法,包括父类中的public方法、实现的接口方法
Method[] methods = obj.getClass().getMethods();
for (Method method : methods) {
// get 方法
if (method.getName().startsWith("get")) {
// 获取属性名
String name = method.getName().substring(3);
name = name.substring(0, 1).toLowerCase() + name.substring(1);
// 获取属性类型
String type = method.getReturnType().getName();
Object value = null;
// 时间类型格式化
try {
if (method.invoke(obj) != null && type.equals("java.util.Date")) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date(method.invoke(obj).toString());
value = format.format(date);
} else {
value = method.invoke(obj);
}
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
map.put(name, value);
}
}
}
```