1. 程式人生 > >初級--反射(通過反射將物件包裝成類似JSON格式)

初級--反射(通過反射將物件包裝成類似JSON格式)

一.什麼是反射。 Java反射就是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;並且能改變它的屬性。 二.實現 我們就建立一個User類

public class User{
	private String username;
	private Integer age;
	private Integer gender;
	//新增幾個get,set方法。
}
public User(){} //無參構造
//有參構造
    public User(String name, Integer age , Integer gender){
        setAge(age);
        setGender(gender);
        setName(name);

    }
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

TestData類

  package com.seecen.reflect.pack;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestData {
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        User user = new User("關羽", 22, 1);
        printJson(user);
        constructor(user);
    }

    public static void printJson(Object obj) throws InvocationTargetException, IllegalAccessException {
        Class<?> clazz = obj.getClass();
        Method[] methods = clazz.getMethods();//得到類方法
        Field[] fields = clazz.getDeclaredFields();//得到類屬性
        //反射
        for (Method method : methods) {
            if (method.getName().startsWith("get")) {
                Object object = method.invoke(obj);//呼叫該方法()引數為該類物件,即呼叫誰的方法。
                System.out.println("{\"" + method.getName() + "\":\"" + object + "\"}");
            }
        }
        for (Field field : fields) {
            field.setAccessible(true);//因為屬性為私有屬性,這句話是為了給訪問許可權,否則會報錯。
            Object value = field.get(obj);
            System.out.println("{\"" + field.getName() + "\":\"" + value + "\"}");

        }

    }
    public static void constructor(Object obj) throws NoSuchMethodException {
        Class<?> clazz=obj.getClass();
        //獲取該類所有建構函式
        Constructor<?>[] constructors=clazz.getDeclaredConstructors();
        for (Constructor<?> constructor : constructors) {
            //兩種方法獲取該構造的引數個數
            System.out.print(constructor.getParameters().length+"\t");
            System.out.print(constructor.getParameterCount()+"\t");
        }
    }

}

    System.out.println(constructor.getParameterCount());
            }
        }
    }

三、控制檯輸出 初步的JSON格式就做好了。 輸出結果