Java通過反射機(jī)制將對象封裝成JSON和JsonArray格式
反射機(jī)制
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個實(shí)體類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機(jī)制
Class 沒有公共構(gòu)造方法。Class 對象是在加載類時由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的 defineClass 方法自動構(gòu)造的。
1.獲取構(gòu)造方法,方法,屬性
(1)getConstructors() 獲取公共的構(gòu)造方法
(2)getDeclaredConstructors() 獲取所有的構(gòu)造方法
(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.獲取構(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();
//獲取該對象所屬類
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ù)傳入的是類的實(shí)例,那么可以反射調(diào)用類的所有方法 包括靜態(tài)方法,前提是 method 是正常獲取 如果 method.invoke(Object obj, Object… args) 第一個參數(shù)傳入的是類的Class對象,那么只能反射調(diào)用類的靜態(tài)方法,否則會報(bào)錯。
一句話概括: 傳入類Class對象只能調(diào)用靜態(tài)方法,傳類的實(shí)例可以調(diào)用所有方法
4.通過反射機(jī)制將對象封裝為json格式
//封裝方法
//通過反射機(jī)制將對象封裝成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.通過反射機(jī)制將對象封裝為jsonArray格式
//通過反射機(jī)制將對象封裝成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));
}到此這篇關(guān)于Java通過反射機(jī)制將對象封裝成JSON和JsonArray格式的文章就介紹到這了,更多相關(guān)Java反射封裝對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Swing JSlider滑塊的實(shí)現(xiàn)示例
這篇文章主要介紹了Java Swing JSlider滑塊的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Java趣味練習(xí)題之輸出兩個日期之間的相隔天數(shù)
本篇文章介紹了我看到的一個趣味小題目,怎么求得兩個日期之間相隔的天數(shù),以及解決該題目的過程及思路,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-10-10
Java多線程之volatile關(guān)鍵字及內(nèi)存屏障實(shí)例解析
volatile是JVM提供的一種最輕量級的同步機(jī)制,因?yàn)镴ava內(nèi)存模型為volatile定義特殊的訪問規(guī)則,使其可以實(shí)現(xiàn)Java內(nèi)存模型中的兩大特性:可見性和有序性。這篇文章主要介紹了Java多線程之volatile關(guān)鍵字及內(nèi)存屏障,需要的朋友可以參考下2019-05-05
實(shí)戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之整合Swagger2到通用模塊
這篇文章主要為大家介紹了實(shí)戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之整合Swagger2到通用模塊,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
java高并發(fā)ScheduledThreadPoolExecutor類深度解析
這篇文章主要為大家介紹了java高并發(fā)ScheduledThreadPoolExecutor類源碼深度解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
MyBatis框架關(guān)聯(lián)映射實(shí)例詳解
這篇文章主要介紹了MyBatis框架關(guān)聯(lián)映射,關(guān)系映射主要處理復(fù)雜的SQl查詢,如子查詢,多表聯(lián)查等復(fù)雜查詢,應(yīng)用此種需求時可以考慮使用,需要的朋友可以參考下2022-11-11
SpringBoot2開啟Actuator端點(diǎn)監(jiān)控的方法
這篇文章主要介紹了SpringBoot2開啟Actuator端點(diǎn)監(jiān)控的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06

