Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式
反射機(jī)制
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)實(shí)體類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射機(jī)制
Class 沒(méi)有公共構(gòu)造方法。Class 對(duì)象是在加載類時(shí)由 Java 虛擬機(jī)以及通過(guò)調(diào)用類加載器中的 defineClass 方法自動(dòng)構(gòu)造的。
1.獲取構(gòu)造方法,方法,屬性
(1)getConstructors() 獲取公共的構(gòu)造方法
(2)getDeclaredConstructors() 獲取所有的構(gòu)造方法
(3)getMethods() 公共的方法(包含父類Object)
(4)getDeclaredMethods() 所有方法(不包含父類)
(5)getFields() 公共的屬性 (6)getDeclaredFields() 所有的屬性
2.Users對(duì)象
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.獲取構(gòu)造方法,方法,屬性
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 //獲取構(gòu)造方法 public void fun1(){ Users users = new Users(); //獲取該對(duì)象所屬類 Class usersClass = users.getClass(); Constructor constructor[]=usersClass.getDeclaredConstructors(); //訪問(wèn)修飾符 方法名(參數(shù)類型 參數(shù)名) for (int i = 0; i < constructor.length; i++) { //獲取訪問(wèn)修飾符 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++) { //獲取訪問(wèn)修飾符 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++) { //獲取訪問(wèn)修飾符 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) 對(duì)帶有指定參數(shù)的指定對(duì)象調(diào)用由此 Method 對(duì)象表示的底層方法。
區(qū)別如下: 如果 method.invoke(Object obj, Object… args) 第一個(gè)參數(shù)傳入的是類的實(shí)例,那么可以反射調(diào)用類的所有方法 包括靜態(tài)方法,前提是 method 是正常獲取 如果 method.invoke(Object obj, Object… args) 第一個(gè)參數(shù)傳入的是類的Class對(duì)象,那么只能反射調(diào)用類的靜態(tài)方法,否則會(huì)報(bào)錯(cuò)。
一句話概括: 傳入類Class對(duì)象只能調(diào)用靜態(tài)方法,傳類的實(shí)例可以調(diào)用所有方法
4.通過(guò)反射機(jī)制將對(duì)象封裝為json格式
//封裝方法 //通過(guò)反射機(jī)制將對(duì)象封裝成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()轉(zhuǎn)小寫 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.通過(guò)反射機(jī)制將對(duì)象封裝為jsonArray格式
//通過(guò)反射機(jī)制將對(duì)象封裝成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(); }
測(cè)試代碼
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)); }
到此這篇關(guān)于Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式的文章就介紹到這了,更多相關(guān)Java反射封裝對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 面向?qū)ο笾^承篇詳解原理與特點(diǎn)
繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類。繼承就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為2021-10-10Eclipse最新版使用過(guò)程中遇到的問(wèn)題總結(jié)
這篇文章主要介紹了Eclipse最新版使用過(guò)程中遇到的問(wèn)題總結(jié)的相關(guān)資料,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09Java使用lambda表達(dá)式簡(jiǎn)化代碼的示例詳解
這篇文章主要給大家介紹了Java如何使用lambda表達(dá)式簡(jiǎn)化代碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-11-11Javaweb基礎(chǔ)入門HTML之table與form
HTML的全稱為超文本標(biāo)記語(yǔ)言,是一種標(biāo)記語(yǔ)言。它包括一系列標(biāo)簽.通過(guò)這些標(biāo)簽可以將網(wǎng)絡(luò)上的文檔格式統(tǒng)一,使分散的Internet資源連接為一個(gè)邏輯整體。HTML文本是由HTML命令組成的描述性文本,HTML命令可以說(shuō)明文字,圖形、動(dòng)畫、聲音、表格、鏈接等2022-03-03Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解
這篇文章主要介紹了Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09java中MultipartFile類型轉(zhuǎn)為File類型的4種方法
Spring提供了一個(gè)MultipartFile接口來(lái)處理文件上傳,但有時(shí)候我們需要將MultipartFile轉(zhuǎn)換為File來(lái)進(jìn)行一些特定的操作,比如保存文件到本地或者進(jìn)行文件的處理等,這篇文章主要給大家介紹了關(guān)于java中MultipartFile類型轉(zhuǎn)為File類型的4種方法,需要的朋友可以參考下2024-09-09深入了解HttpClient的ResponseHandler接口
這篇文章主要為大家介紹了深入了解HttpClient的ResponseHandler接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10MyBatis中多對(duì)多關(guān)系的映射和查詢
本文主要介紹了MyBatis中多對(duì)多關(guān)系的映射和查詢的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02