Java反射,泛型在Json中的運(yùn)用
最近項(xiàng)目中遇到了Json數(shù)據(jù)自動(dòng)獲取的功能,不然令人想起java的反射,已經(jīng)很長(zhǎng)時(shí)間沒(méi)復(fù)習(xí)java了正好一塊連java的這一塊內(nèi)容一起過(guò)一遍。java中的反射無(wú)疑就相當(dāng)于java開(kāi)發(fā)者的春天,在眾多的框架中也能看到它的身影,可以在運(yùn)行時(shí)檢查類(lèi),接口、變量和方法等信息,可以實(shí)例化調(diào)用方法以及設(shè)置變量值等。本文主要以代碼的形式直接將反射,泛型的運(yùn)用展現(xiàn)出來(lái)。
java中的反射
首先新建一個(gè)基礎(chǔ)類(lèi)Author。
package bean;
/**
*
* @author Super~me
* Description: 基礎(chǔ)類(lèi)
*
*/
public class Author {
private static String TAG="Big";
private String name;
private int age;
public Author(){}
public Author(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Author [name=" + name + ", age=" + age + "]";
}
private String pMethod(String t){
String result=t+" Private Method";
return result;
}
}
然后新建一個(gè)反射類(lèi),運(yùn)用反射方法對(duì)上面的類(lèi)進(jìn)行訪問(wèn).包括對(duì)私有方法的訪問(wèn),對(duì)私有屬性的訪問(wèn)等。其中常用的一些方法以及解釋?zhuān)?/p>

//對(duì)象的創(chuàng)建
public static void reflectNewInstance(){
try {
Class<?> authorclass=Class.forName(path_reflectfrom);
Object object =authorclass.newInstance();
Author author=(Author) object;
author.setName("周大亨");
author.setAge(89);
System.out.println("author: "+author.toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//對(duì)私有的方法進(jìn)行反射
public static void reflectPrivateConstructor(){
try {
Class<?> authorclass =Class.forName(path_reflectfrom);
Constructor<?> declaredConstructor =authorclass.getDeclaredConstructor(String.class,int.class);
declaredConstructor.setAccessible(true);
Object object=declaredConstructor.newInstance("lida",88);
Author author=(Author) object;
System.out.println( "Author: "+author.toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//反射私有的屬性
public static void reflectPrivateField(){
try {
Class<?> authorclass =Class.forName(path_reflectfrom);
Object authorobject=authorclass.newInstance();
Field field=authorclass.getDeclaredField("TAG");
field.setAccessible(true);
String tag=(String)field.get(authorobject);
System.out.println( "private field Tag:"+tag);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//反射獲取私有的方法
private static void reflectMethod(){
try {
Class<?> authorclass=Class.forName(path_reflectfrom);
Object authorobject=authorclass.newInstance();
Method authormethod=authorclass.getDeclaredMethod("pMethod", String.class);
authormethod.setAccessible(true);
String string=(String)authormethod.invoke(authorobject, TAG);
System.out.println( "private Method: "+string);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通過(guò)控制臺(tái)打印以上信息:查看運(yùn)用結(jié)果
ReflectClass.reflectNewInstance(); ReflectClass.reflectPrivateField(); ReflectClass.reflectPrivateConstructor(); ReflectClass.reflectMethod();
運(yùn)行結(jié)果:

泛型的運(yùn)用
對(duì)于泛型其實(shí)很好理解,通俗點(diǎn)講就是我們將類(lèi)型也當(dāng)成了參數(shù)進(jìn)行傳值,這樣做代碼的安全性很大的被提升了,也為較大的優(yōu)化帶來(lái)可能。泛型可以使編譯器知道一個(gè)對(duì)象的限定類(lèi)型是什么,這樣編譯器就可以在一個(gè)高的程度上驗(yàn)證這個(gè)類(lèi)型消除了強(qiáng)制類(lèi)型轉(zhuǎn)換 使得代碼可讀性好,減少了很多出錯(cuò)的機(jī)會(huì)。但是也要記住泛型的規(guī)范,比如靜態(tài)的變量和方法不能引用泛型變量,我們也不能利用instanceof等方法對(duì)泛型的類(lèi)型進(jìn)行判斷,當(dāng)然這樣做也毫無(wú)意義,重要的一點(diǎn)是泛型類(lèi)不能繼承Exception或者Throwable。泛型的繼承中,不論子類(lèi)是否為泛型類(lèi),所繼承和實(shí)現(xiàn)的父類(lèi)接口都需要被指定。
常用的泛型類(lèi)型變量:
E:元素(Element)
K:關(guān)鍵字(Key)
N:數(shù)字(Number)
T:類(lèi)型(Type)
V:值(Value)
另外泛型界定的概念主要是指對(duì)泛型類(lèi)型進(jìn)行一個(gè)限定。比如:
public static <T extends String> T add(T str1, T str2) { return "";}
利用泛型和反射實(shí)現(xiàn)對(duì)json數(shù)據(jù)的保存
//利用反射獲取json數(shù)據(jù)到j(luò)ava類(lèi)
private static void getJson(){
try {
String json = "{\"name\":\"Miss王\",\"age\":79}";
JSONObject source=JSONObject.parseObject(json);
Class<?> aClass = Class.forName("bean.Author");
Object obj = aClass.newInstance();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
System.out.println(source.getString(field.getName()));
if (field.getGenericType().toString().equals(String.class.toString())) {
field.set(obj, source.getString(field.getName()));
} else if (field.getGenericType().toString().equals(int.class.toString())) {
field.set(obj, source.getInteger(field.getName()));
}
}
Author author = (Author) obj;
System.out.print(author);
} catch (Exception e) {
e.printStackTrace();
}
}
我們想把以上的實(shí)現(xiàn)封裝起來(lái),這時(shí)就用了泛型。
//泛型+反射實(shí)現(xiàn)json數(shù)據(jù)讀取到j(luò)ava類(lèi)
public static <T> T getJsonClass(String json, Class<T> beanclass) {
try {
JSONObject jsonObject = JSONObject.parseObject(json);
Object obj = beanclass.newInstance();
//拿到所以元素
Field[] declaredFields = beanclass.getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
if (field.getGenericType().toString().equals(String.class.toString())) {
String value=jsonObject.getString(field.getName());
if(value!=null){
field.set(obj,value);
System.out.println(value);
}
} else if (field.getGenericType().toString().equals(int.class.toString())) {
if(jsonObject.getInteger(field.getName())!=null)
field.set(obj,jsonObject.getInteger(field.getName()));
}
}
return (T) obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
調(diào)用實(shí)現(xiàn):
public static void main(String[] args) {
// TODO Auto-generated method stub
String json = "{\"name\":\"李先生\",\"age\":82}";
//ReflectJson.getJson();
//解析json然后換成實(shí)體類(lèi)
Author author=getJsonClass(json, Author.class);
System.out.print( author.toString());
}
運(yùn)行結(jié)果:


以上就是Java反射,泛型在Json中的運(yùn)用的詳細(xì)內(nèi)容,更多關(guān)于Java反射,泛型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java+opencv實(shí)現(xiàn)人臉識(shí)別功能
這篇文章主要介紹了java+opencv實(shí)現(xiàn)人臉識(shí)別功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
解決springboot環(huán)境切換失效的問(wèn)題
這篇文章主要介紹了解決springboot環(huán)境切換失效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java設(shè)計(jì)模式之享元模式(Flyweight Pattern)詳解
享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,旨在減少對(duì)象的數(shù)量,以節(jié)省內(nèi)存空間和提高性能,本文將詳細(xì)的給大家介紹一下Java享元模式,需要的朋友可以參考下2023-07-07
Java Collection集合遍歷運(yùn)行代碼實(shí)例
這篇文章主要介紹了Java Collection集合遍歷運(yùn)行代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

