结果展示:
{b={i=1, j=null, CLASS_TYPE=class org.kelab.swustoj.model.B}, c={k=2, l=sda, CLASS_TYPE=class org.kelab.swustoj.model.C}, CLASS_TYPE=class org.kelab.swustoj.model.A} A(b=B(i=1, j=null), c=C(k=2, l=sda))相关方法:
/** * 判断是否基本类型:不包括String * * @param obj * @return */ public static boolean isWrapClass(@NonNull Object obj) { try { return ((Class) obj.getClass().getField("TYPE").get(null)).isPrimitive(); } catch (Exception e) { return false; } } /** * 利用反射设置属性值 * (1)getDeclaredFields()返回Class中所有的字段,包括私有字段; * (2)getFields 只返回公共字段,即有public修饰的字段 * Object value 可为空 * * @param obj * @param fieldName * @param value */ @SneakyThrows public static void setFieldValue(@NonNull Object obj, @NonNull String fieldName, Object value) { Class baseClazz = obj.getClass(); for (; !baseClazz.equals(Object.class); baseClazz = baseClazz.getSuperclass()) { try { PropertyDescriptor pd = new PropertyDescriptor(fieldName, baseClazz); Method method = pd.getWriteMethod(); if (!Modifier.isPublic(method.getModifiers())) { //设置非共有类属性权限 method.setAccessible(true); } method.invoke(obj, value); } catch (Exception e) { Field targetField = baseClazz.getDeclaredField(fieldName); if (!Modifier.isPublic(targetField.getModifiers())) { //设置非共有类属性权限 targetField.setAccessible(true); } targetField.set(obj, value); //设置类属性值 // 异常直接抛出 } } } /** * 利用反射获取属性值 * * @param obj * @param fieldName */ @SneakyThrows public static <T> T getFieldValue(@NonNull Object obj, @NonNull String fieldName, @NonNull Class<T> clazz) { T res = null; Class baseClazz = obj.getClass(); for (; res == null && !baseClazz.equals(Object.class); baseClazz = baseClazz.getSuperclass()) { try { PropertyDescriptor pd = new PropertyDescriptor(fieldName, baseClazz); Method method = pd.getReadMethod(); if (!Modifier.isPublic(method.getModifiers())) { //设置非共有类属性权限 method.setAccessible(true); } res = (T) method.invoke(obj); } catch (Exception e) { Field targetField = null; targetField = baseClazz.getDeclaredField(fieldName); if (!Modifier.isPublic(targetField.getModifiers())) { //设置非共有类属性权限 targetField.setAccessible(true); } res = (T) targetField.get(obj); //设置类属性值 // 在此抛出异常会直接抛出 } } return res; }