java 反射之獲取泛型對象的所有字段與對應的值包括父類

public static void main(String[] args) throws IntrospectionException {
        SysUser obj = new SysUser();
        obj.setId(1L);
        obj.setUserName("測試");
        obj.setCreatedDate(LocalDateTime.now());

        Class<?> clazz = SysUser.class;
        Field[] tableFields = clazz.getDeclaredFields();
        Class<?> superClazz = clazz.getSuperclass();
        if (superClazz.equals(Object.class)) {
            System.out.println("沒有父類");
        } else {
            Field[] tableSuperFields = superClazz.getDeclaredFields();
            Field[] superFields = new Field[tableFields.length + tableSuperFields.length];
            System.arraycopy(tableFields, 0, superFields, 0, tableFields.length);
            System.arraycopy(tableSuperFields, 0, superFields, tableFields.length, tableSuperFields.length);
            Field[] allFields = getSuperClassFields(superFields, superClazz);
            for (int i = 0; i < allFields.length; i++) {
                PropertyDescriptor pd = new PropertyDescriptor(allFields[i].getName(), clazz);
                Method getMethod = pd.getReadMethod();//獲得get方法
                Object fieldValue = ReflectionUtils.invokeMethod(getMethod, obj);
                if(fieldValue == null){
                    continue;
                }

                System.out.println(allFields[i].getName() + "的值:" +  fieldValue.toString());
            }
        }
    }

   //獲取父類的所有字段
    private static Field[] getSuperClassFields(Field[] tableFields, Class<?> clazz) {
        Class<?> superClazz = clazz.getSuperclass();
        if (superClazz.equals(Object.class)) {
            return tableFields;
        }
        Field[] tableSuperFields = superClazz.getDeclaredFields();

        Field[] c = new Field[tableFields.length + tableSuperFields.length];
        System.arraycopy(tableFields, 0, c, 0, tableFields.length);
        System.arraycopy(tableSuperFields, 0, c, tableFields.length, tableSuperFields.length);
        getSuperClassFields(c, superClazz);
        return c;
    }

 

案例2:

static void getClassFieldAndMethod(Class cur_class) {
    String class_name = cur_class.getName();
    Field[] obj_fields = cur_class.getDeclaredFields();
    for (Field field : obj_fields) {
        field.setAccessible(true);
        System.out.println(class_name + ":" + field.getName());
    }
    Method[] methods = cur_class.getDeclaredMethods();
    for (Method method : methods) {
        method.setAccessible(true);
        System.out.println(class_name + ":" + method.getName());
    }
    if (cur_class.getSuperclass() != null) {
        getClassFieldAndMethod(cur_class.getSuperclass());
    }
}
	static void getObjField(Object obj) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
	
		Class cur_class = obj.getClass();
		getClassFieldAndMethod(cur_class);
        Field vfield=cur_class.getDeclaredField("value");
        vfield.setAccessible(true);
        char[]value=(char[])vfield.get(obj);
        System.out.println(Arrays.toString(value));
	}

創建對象,調用上面那段代碼的方法getClassFieldAndMethod(),這樣你就知道這個對象都有些什麼域,什麼方法了,再通過域的名稱,就可以獲取當前這個對象的域的值,進而可以修改了!!

是不是很簡單,從此以後誰都不能限制你在Java程序裏面爲所欲爲了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章