初級--反射(通過反射將物件包裝成類似JSON格式)
阿新 • • 發佈:2018-12-15
一.什麼是反射。 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格式就做好了。