Java通過反射機(jī)制將對象封裝成JSON和JsonArray格式
反射機(jī)制
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個(gè)實(shí)體類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象,都能夠調(diào)用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機(jī)制
Class 沒有公共構(gòu)造方法。Class 對象是在加載類時(shí)由 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) 第一個(gè)參數(shù)傳入的是類的實(shí)例,那么可以反射調(diào)用類的所有方法 包括靜態(tài)方法,前提是 method 是正常獲取 如果 method.invoke(Object obj, Object… args) 第一個(gè)參數(shù)傳入的是類的Class對象,那么只能反射調(diào)用類的靜態(tài)方法,否則會報(bào)錯(cuò)。
一句話概括: 傳入類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 面向?qū)ο笾^承篇詳解原理與特點(diǎn)
繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因?yàn)樗试S創(chuàng)建分等級層次的類。繼承就是子類繼承父類的特征和行為,使得子類對象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為2021-10-10
Javaweb基礎(chǔ)入門HTML之table與form
HTML的全稱為超文本標(biāo)記語言,是一種標(biāo)記語言。它包括一系列標(biāo)簽.通過這些標(biāo)簽可以將網(wǎng)絡(luò)上的文檔格式統(tǒng)一,使分散的Internet資源連接為一個(gè)邏輯整體。HTML文本是由HTML命令組成的描述性文本,HTML命令可以說明文字,圖形、動畫、聲音、表格、鏈接等2022-03-03
Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解
這篇文章主要介紹了Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
java中MultipartFile類型轉(zhuǎn)為File類型的4種方法
Spring提供了一個(gè)MultipartFile接口來處理文件上傳,但有時(shí)候我們需要將MultipartFile轉(zhuǎn)換為File來進(jìn)行一些特定的操作,比如保存文件到本地或者進(jìn)行文件的處理等,這篇文章主要給大家介紹了關(guān)于java中MultipartFile類型轉(zhuǎn)為File類型的4種方法,需要的朋友可以參考下2024-09-09
深入了解HttpClient的ResponseHandler接口
這篇文章主要為大家介紹了深入了解HttpClient的ResponseHandler接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

