Java通過反射機制將對象封裝成JSON和JsonArray格式
反射機制
JAVA反射機制是在運行狀態(tài)中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機制
Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調(diào)用類加載器中的 defineClass 方法自動構造的。
1.獲取構造方法,方法,屬性
(1)getConstructors() 獲取公共的構造方法
(2)getDeclaredConstructors() 獲取所有的構造方法
(3)getMethods() 公共的方法(包含父類Object)
(4)getDeclaredMethods() 所有方法(不包含父類)
(5)getFields() 公共的屬性 (6)getDeclaredFields() 所有的屬性
2.Users對象
package com.it.bean; public class Users { private int age; public String name; char sex; public Users() { } public Users(String name, char sex) { this.name = name; this.sex = sex; } public Users(int age, String name, char sex) { this.age = age; this.name = name; this.sex = sex; } Users(int age, String name) { this.age = age; this.name = name; } private Users(String name,int age){ } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public void fun1(){ System.out.println("fun1---"); } public void fun2(String x,String y){ } void fun3(int age){ } private int fun4(){ return 0; } protected void fun5(){ } }
3.獲取構造方法,方法,屬性
package com.it.reflect; import com.it.bean.Users; import org.junit.Test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Parameter; public class Demo2 { @Test //獲取構造方法 public void fun1(){ Users users = new Users(); //獲取該對象所屬類 Class usersClass = users.getClass(); Constructor constructor[]=usersClass.getDeclaredConstructors(); //訪問修飾符 方法名(參數(shù)類型 參數(shù)名) for (int i = 0; i < constructor.length; i++) { //獲取訪問修飾符 if(constructor[i].getModifiers()==1){ System.out.print("public "); }else if(constructor[i].getModifiers()==4){ System.out.print("protected "); }else if(constructor[i].getModifiers()==2){ System.out.print("private "); } //獲取方法名 System.out.print(constructor[i].getName()+"("); //獲取參數(shù)類型 數(shù)組 Class parType[]=constructor[i].getParameterTypes(); for (int j = 0; j <parType.length ; j++) { if(j!=parType.length-1){ System.out.print(parType[j].getTypeName()+","); }else{ System.out.print(parType[j].getTypeName()); } } System.out.println(")"); } } //獲取方法 @Test public void fun2(){ Users users = new Users(); Class usersClass = users.getClass(); Method method[]=usersClass.getMethods(); for (int i = 0; i <method.length ; i++) { //獲取訪問修飾符 if(method[i].getModifiers()==1){ System.out.print("public "); }else if(method[i].getModifiers()==4){ System.out.print("protected "); }else if(method[i].getModifiers()==2){ System.out.print("private "); } //獲取返回值類型 Class returnType=method[i].getReturnType(); //拼接返回值類型和方法名 System.out.print(returnType.getName()+" "+method[i].getName()+"("); //形參類型 Class parType[]=method[i].getParameterTypes(); for (int j = 0; j <parType.length ; j++) { if(j!=parType.length-1){ System.out.print(parType[j].getTypeName()+","); }else{ System.out.print(parType[j].getTypeName()); } } System.out.println(")"); } } //獲取屬性 @Test public void fun3(){ Users users=new Users(); Class userClass=users.getClass(); Field field[]=userClass.getDeclaredFields(); for (int i = 0; i <field.length ; i++) { //獲取訪問修飾符 if(field[i].getModifiers()==1){ System.out.print("public "); }else if(field[i].getModifiers()==4){ System.out.print("protected "); }else if(field[i].getModifiers()==2){ System.out.print("private "); } //獲取數(shù)據(jù)類型 和屬性名 System.out.println(field[i].getType().getTypeName()+" "+field[i].getName()+";"); } } }
Object invoke(Object obj, Object… args) 對帶有指定參數(shù)的指定對象調(diào)用由此 Method 對象表示的底層方法。
區(qū)別如下: 如果 method.invoke(Object obj, Object… args) 第一個參數(shù)傳入的是類的實例,那么可以反射調(diào)用類的所有方法 包括靜態(tài)方法,前提是 method 是正常獲取 如果 method.invoke(Object obj, Object… args) 第一個參數(shù)傳入的是類的Class對象,那么只能反射調(diào)用類的靜態(tài)方法,否則會報錯。
一句話概括: 傳入類Class對象只能調(diào)用靜態(tài)方法,傳類的實例可以調(diào)用所有方法
4.通過反射機制將對象封裝為json格式
//封裝方法 //通過反射機制將對象封裝成JSON格式 //{'id':'001','name':'hhh','age':'12'} public static String objToJson(Object object) { Class cls = object.getClass(); Method method[] = cls.getMethods(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("{"); //從方法中截取屬性名 //控制, int j = 0; for (int i = 0; i < method.length; i++) { //獲取屬性名 if (method[i].getName().startsWith("get") && method[i].getModifiers() == 1) { if (j != 0) { stringBuilder.append(","); } //獲得名字截取 getName()轉小寫 String fieldName = method[i].getName().substring(3).toLowerCase(); // System.out.println("field->" + fieldName); stringBuilder.append("'" + fieldName + "'" + ":"); //獲取值 try { stringBuilder.append("'" + method[i].invoke(object) + "'"); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } j++; } } stringBuilder.append("}"); // System.out.println(stringBuilder.toString()); return stringBuilder.toString(); }
5.通過反射機制將對象封裝為jsonArray格式
//通過反射機制將對象封裝成JSONArray格式 //[{},{},{},{}] public static String objToJsonArray(List<Object> objectList) { StringBuilder stringBuilder=new StringBuilder(); stringBuilder.append("["); for (int i = 0; i <objectList.size() ; i++) { if(i!=0){ stringBuilder.append(","); } //調(diào)用封裝好的json格式 stringBuilder.append(objToJson(objectList.get(i))); } stringBuilder.append("]"); // System.out.println(stringBuilder); return stringBuilder.toString(); }
測試代碼
public static void main(String[] args) { UserInfo userInfo1 = new UserInfo(001, "花花1", '女'); Prov prov = new Prov("sx001","西安市"); System.out.println("json"); System.out.println(objToJson(userInfo1)); System.out.println("jsonArry"); UserInfo userInfo2 = new UserInfo(002, "花花2", '女'); UserInfo userInfo3 = new UserInfo(003, "花花3", '女'); List list=new ArrayList(); list.add(userInfo1); list.add(userInfo2); list.add(userInfo3); System.out.println(objToJsonArray(list)); }
到此這篇關于Java通過反射機制將對象封裝成JSON和JsonArray格式的文章就介紹到這了,更多相關Java反射封裝對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java多線程 ReentrantReadWriteLock原理及實例詳解
這篇文章主要介紹了Java多線程 ReentrantReadWriteLock原理及實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09java中MultipartFile類型轉為File類型的4種方法
Spring提供了一個MultipartFile接口來處理文件上傳,但有時候我們需要將MultipartFile轉換為File來進行一些特定的操作,比如保存文件到本地或者進行文件的處理等,這篇文章主要給大家介紹了關于java中MultipartFile類型轉為File類型的4種方法,需要的朋友可以參考下2024-09-09深入了解HttpClient的ResponseHandler接口
這篇文章主要為大家介紹了深入了解HttpClient的ResponseHandler接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10