最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java反射,泛型在Json中的運(yùn)用

 更新時(shí)間:2020年12月23日 11:40:09   作者:Super~me  
這篇文章主要介紹了Java反射,泛型在Json中的運(yùn)用,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

最近項(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)文章

  • 關(guān)于JSqlparser使用攻略(高效的SQL解析工具)

    關(guān)于JSqlparser使用攻略(高效的SQL解析工具)

    這篇文章主要介紹了關(guān)于JSqlparser使用攻略(高效的SQL解析工具),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot如何使用mica-xss防止Xss攻擊

    SpringBoot如何使用mica-xss防止Xss攻擊

    這篇文章主要介紹了SpringBoot如何使用mica-xss防止Xss攻擊問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 一文帶你徹底了解Java8中的Lambda,函數(shù)式接口和Stream

    一文帶你徹底了解Java8中的Lambda,函數(shù)式接口和Stream

    這篇文章主要為大家詳細(xì)介紹了解Java8中的Lambda,函數(shù)式接口和Stream的用法和原理,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • FuncGPT慧函數(shù)保護(hù)數(shù)據(jù)安全提高代碼質(zhì)量減少軟件故障(java示例)

    FuncGPT慧函數(shù)保護(hù)數(shù)據(jù)安全提高代碼質(zhì)量減少軟件故障(java示例)

    這篇文章主要為大家介紹了FuncGPT慧函數(shù)保護(hù)數(shù)據(jù)安全提高代碼質(zhì)量減少軟件故障(java示例),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • servlet實(shí)現(xiàn)文件上傳與下載功能

    servlet實(shí)現(xiàn)文件上傳與下載功能

    這篇文章主要為大家詳細(xì)介紹了servlet實(shí)現(xiàn)文件上傳與下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java用GDAL讀寫(xiě)shapefile的方法示例

    Java用GDAL讀寫(xiě)shapefile的方法示例

    Shapefile文件是描述空間數(shù)據(jù)的幾何和屬性特征的非拓?fù)鋵?shí)體矢量數(shù)據(jù)結(jié)構(gòu)的一種格式,由ESRI公司開(kāi)發(fā)。這篇文章給大家介紹了Java如何用GDAL讀寫(xiě)shapefile的方法示例,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • java數(shù)據(jù)結(jié)構(gòu)和算法之馬踏棋盤(pán)算法

    java數(shù)據(jù)結(jié)構(gòu)和算法之馬踏棋盤(pán)算法

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)和算法之馬踏棋盤(pán)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java double類(lèi)型相加精度問(wèn)題的解決

    java double類(lèi)型相加精度問(wèn)題的解決

    這篇文章主要介紹了java double類(lèi)型相加精度問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • springmvc數(shù)據(jù)的封裝過(guò)程詳解

    springmvc數(shù)據(jù)的封裝過(guò)程詳解

    這篇文章主要介紹了springmvc數(shù)據(jù)的封裝過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java Hibernate使用方法及整合查詢(xún)

    Java Hibernate使用方法及整合查詢(xún)

    這篇文章主要介紹了Java使用與整合Hibernate,在正式進(jìn)入Hibernate的高級(jí)應(yīng)用之前,需要了解聲明是數(shù)據(jù)模型與領(lǐng)域模型,這兩個(gè)概念將會(huì)幫助我們更好的理解實(shí)體對(duì)象的關(guān)聯(lián)關(guān)系映射
    2023-04-04

最新評(píng)論

永吉县| 定南县| 临洮县| 津南区| 临泉县| 桓台县| 高陵县| 沙河市| 洪雅县| 东丰县| 天门市| 汶川县| 灵石县| 杭锦旗| 崇文区| 乌恰县| 会同县| 杭锦旗| 年辖:市辖区| 湖口县| 大安市| 郓城县| 信阳市| 绥阳县| 疏附县| 临泉县| 县级市| 长海县| 宣恩县| 曲阜市| 罗定市| 威远县| 隆德县| 平乡县| 台南市| 宁晋县| 托克逊县| 遵化市| 临泉县| 泸西县| 军事|