在Java中,反射能够使得代码更加通用,往往用于工具类中。
但常常我们在获取或者赋值反射的属性时,会出现没有赋值成功的结果,往往是由于这个属性在父级中而导致的,这个时候我们就不能用getDeclaredField
方法单独获取字段,而是循环遍历所有的父级取字段。
下面提供获取所有属性方法(包括父级):
java
/**
* description: 从当前以及父类中获取全部字段
*
* @param clazz 属性所在类
* @return java.lang.reflect.Field
*/
public static List<Field> getFieldByCurrentAndSuper(Class<?> clazz) {
List<Field> fields = new ArrayList<>();
getFieldByCurrentAndSuper(clazz, fields);
return fields;
}
/**
* description: 从当前以及父类中获取全部字段
*
* @param clazz 属性所在类
* @return java.lang.reflect.Field
*/
private static List<Field> getFieldByCurrentAndSuper(Class<?> clazz, List<Field> fields) {
Field[] declaredFields = clazz.getDeclaredFields();
fields.addAll(Arrays.asList(declaredFields));
if (!clazz.equals(Object.class)) {
return getFieldByCurrentAndSuper(clazz.getSuperclass(), fields);
}
return fields;
}
我们拿到泛型的Class后,就可以直接调用getFieldByCurrentAndSuper
方法来获取所有属性,然后遍历对属性操作,如下:
java
/**
* 深度赋值属性
*/
private static void setField(Class<?> clazz, String userTenantCode, Object arg) throws IllegalAccessException {
try {
List<Field> fieldList = getFieldByCurrentAndSuper(clazz);
if (fieldList.size() > 0) {
for (Field field : fieldList) {
if (field.getName().equals("tenantCode")) {
// 设置可访问私有属性
field.setAccessible(true);
field.set(arg, userTenantCode);
}
}
}
} catch (Exception ignored) {
}
}