网站建设公司发展理念,佛山建网站哪家好,网站浮动窗口代码php,怎么优化自己的网站在Java中#xff0c;反射能够使得代码更加通用#xff0c;往往用于工具类中。 但常常我们在获取或者赋值反射的属性时#xff0c;会出现没有赋值成功的结果#xff0c;往往是由于这个属性在父级中而导致的#xff0c;这个时候我们就不能用getDeclaredField方法单独获取字段…在Java中反射能够使得代码更加通用往往用于工具类中。 但常常我们在获取或者赋值反射的属性时会出现没有赋值成功的结果往往是由于这个属性在父级中而导致的这个时候我们就不能用getDeclaredField方法单独获取字段而是循环遍历所有的父级取字段。
下面提供获取所有属性方法包括父级 /*** description: 从当前以及父类中获取全部字段** param clazz 属性所在类* return java.lang.reflect.Field*/
public static ListField getFieldByCurrentAndSuper(Class? clazz) {ListField fields new ArrayList();getFieldByCurrentAndSuper(clazz, fields);return fields;
}/*** description: 从当前以及父类中获取全部字段** param clazz 属性所在类* return java.lang.reflect.Field*/
private static ListField getFieldByCurrentAndSuper(Class? clazz, ListField fields) {Field[] declaredFields clazz.getDeclaredFields();fields.addAll(Arrays.asList(declaredFields));if (!clazz.equals(Object.class)) {return getFieldByCurrentAndSuper(clazz.getSuperclass(), fields);}return fields;
}我们拿到泛型的Class后就可以直接调用getFieldByCurrentAndSuper方法来获取所有属性然后遍历对属性操作如下
/*** 深度赋值属性*/
private static void setField(Class? clazz, String userTenantCode, Object arg) throws IllegalAccessException {try {ListField 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) {}
}