欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 獲取泛型的類型實(shí)例詳解

 更新時(shí)間:2017年05月26日 14:52:33   作者:IamOkay  
這篇文章主要介紹了Java 獲取泛型的類型實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下

Java 獲取泛型的類型實(shí)例詳解

Java 泛型實(shí)際上有很多缺陷,比如不能直接獲取泛型的類型,不能獲取帶泛型類等。

以下方式是不正確的:

①.獲取帶泛型的類的類型

Class lstUClazz = List<User>.class

②獲取局部變量泛型的類型

List<User> listUser = new ArrayList<User>();
Type genType = listUser.getClass().getClass().getGenericSuperclass();

Class templatClazz = null;

if(ParameterizedType.class.isInstance(genType)
{
  //無法獲取到User類,或者可能獲取到錯(cuò)誤的類型,如果有同名且不帶包名的泛型存在
  ParameterizedType parameterizedType = (ParameterizedType) genType;
 templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}

 

那么,如何才能獲取到泛型的類型

①.必須具有真實(shí)類型的存在

②.泛型的類型是明確的如(List<User>是明確的,List<T>是不明確的)

滿足以上兩點(diǎn),我們就可以獲取泛型的類型了

1.通過繼承方式,明確類型,然后獲取泛型類

public abstract class JdbcDaoSupport<T> {
   
  protected JdbcDaoSupport() {
    
  }
   public Class getTempalteType()
  {
     Class<T> clazz = (Class<T>) ((ParameterizedType) getClass()
        .getGenericSuperclass()).getActualTypeArguments()[0];
     return clazz;                    
  }
}

public class UserDao extends JdbcDaoSupport<User> {
}

public class Test{
    public static void main(String[] args)
    {
      UserDao dao = new UserDao();
      Class clazz = dao.getTemplateType();
      System.out.println(clazz.getName()); //輸出 xxx.xxx.User
    }
}

2.獲取類屬性的泛型類型

public class Test extends ClassA<String> { 
  private List<String> list; 
  private Map<String, Object> map; 
 
  /*** 
   * 獲取List中的泛型 
   */ 
  public static void testList() throws NoSuchFieldException, SecurityException { 
    Type t = Test.class.getDeclaredField("list").getGenericType(); 
    if (ParameterizedType.class.isAssignableFrom(t.getClass())) { 
      for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) { 
        System.out.print(t1 + ","); 
      } 
      System.out.println(); 
    } 
  } 
 
  /*** 
   * 獲取Map中的泛型 
   */ 
  public static void testMap() throws NoSuchFieldException, SecurityException { 
    Type t = Test.class.getDeclaredField("map").getGenericType(); 
    if (ParameterizedType.class.isAssignableFrom(t.getClass())) { 
      for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) { 
        System.out.print(t1 + ","); 
      } 
      System.out.println(); 
    } 
  } 
 
  public static void main(String args[]) throws Exception { 
    System.out.println(">>>>>>>>>>>testList>>>>>>>>>>>"); 
    testList(); 
    System.out.println("<<<<<<<<<<<testList<<<<<<<<<<<\n"); 
    System.out.println(">>>>>>>>>>>testMap>>>>>>>>>>>"); 
    testMap(); 
    System.out.println("<<<<<<<<<<<testMap<<<<<<<<<<<\n"); 
    System.out.println(">>>>>>>>>>>testClassA>>>>>>>>>>>"); 
    new Test().testClassA(); 
    System.out.println("<<<<<<<<<<<testClassA<<<<<<<<<<<"); 
  } 
 
} 

3.獲取局部變量的泛型的類型

List<User> lst = new ArrayList<User>(){};
Type genType = listUser.getClass().getClass().getGenericSuperclass();

Class templatClazz = null;

if(ParameterizedType.class.isInstance(genType)
{
  ParameterizedType parameterizedType = (ParameterizedType) genType;
 templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}

 實(shí)際上,我們發(fā)現(xiàn),能獲取到泛型的類型實(shí)際上都是進(jìn)行了“繼承”。當(dāng)然如果能熟練運(yùn)用上述技巧,可以做很多事情,比如開源項(xiàng)目Gson中的TypeToken就是利用上述技巧,實(shí)現(xiàn)json與復(fù)雜類型的轉(zhuǎn)換的。

 很多情況下,Class被用來當(dāng)作參數(shù),我們其實(shí)可以將帶泛型的類作為參數(shù)傳入

我們一般為了方便,很少去特定定義一個(gè)類,因此,我們需要使用如下方式了。

Class clz = new ArrayList<User>(){}.getClass();

例子

class JsonToObjectUtil {

 public static <T> T jsonToObject(Class<T> clz,List<String> jsonList){
 
 Type genType = clz.getClass().getGenericSuperclass();
 Class templatClazz = null;
 
 if(ParameterizedType.class.isInstance(genType));
 {
  ParameterizedType parameterizedType = (ParameterizedType) genType;
  templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
 }
 List<Object> lst = new ArrayList<Object>();
 /*****/
 if(templatClazz!=null && jsonList!=null)
 {
  for (String str : jsonList) {
  
  Gson gson = new Gson();
  Object fromJson = gson.fromJson(str, templatClazz);
  lst.add(fromJson);
  }
  
 }
 /*****/
 return (T) lst;
 }
 
 public static void main(String[] args) {
 
 List<String> jsonList = null;
 //略去一部分填充jsonList的邏輯
 
 Class superClazz = new ArrayList<User>(){}.getClass();
 List jsonToObject = JsonToObjectUtil.jsonToObject(superClazz, jsonList);
 
 }
 
}

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

您可能感興趣的文章:

相關(guān)文章

  • springboot如何讀取配置文件到靜態(tài)工具類

    springboot如何讀取配置文件到靜態(tài)工具類

    這篇文章主要介紹了springboot實(shí)現(xiàn)讀取配置文件到靜態(tài)工具類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot上傳和下載文件的原理解析

    SpringBoot上傳和下載文件的原理解析

    文件上傳的功能很常見,但是很多人并不清楚文件上傳后的具體原理,接下來通過本文給大家分享SpringBoot上傳和下載文件的原理解析,感興趣的朋友一起看看吧
    2021-07-07
  • Springboot把外部依賴包納入Spring容器管理的兩種方式

    Springboot把外部依賴包納入Spring容器管理的兩種方式

    這篇文章主要給大家介紹了Springboot把外部依賴包納入Spring容器管理的兩種方式,Spring.factories和org.springframework.boot.autoconfigure.AutoConfiguration.imports,有感興趣的小伙伴可以參考閱讀本文
    2023-07-07
  • Java中對(duì)于并發(fā)問題的處理思路分享

    Java中對(duì)于并發(fā)問題的處理思路分享

    并發(fā)粗暴的解釋就是一段代碼,在同一時(shí)間段內(nèi),被多個(gè)線程同時(shí)處理的情況就是并發(fā)現(xiàn)象。這篇文章和大家分享了一些對(duì)于并發(fā)問題的處理思路,需要的可以參考一下
    2023-02-02
  • Java教程package和import訪問控制的步驟詳解

    Java教程package和import訪問控制的步驟詳解

    這篇文章主要為大家介紹了Java教程package和import訪問控制的步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 實(shí)例詳解SpringMVC入門使用

    實(shí)例詳解SpringMVC入門使用

    大家好,本篇文章主要講的是實(shí)例詳解SpringMVC入門使用,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 如何使用IDEA創(chuàng)建MAPPER模板過程圖解

    如何使用IDEA創(chuàng)建MAPPER模板過程圖解

    這篇文章主要介紹了如何使用IDEA創(chuàng)建MAPPER模板,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java 冒泡排序、快速排序?qū)嵗a

    Java 冒泡排序、快速排序?qū)嵗a

    這篇文章主要介紹了Java 冒泡排序、快速排序?qū)嵗a,需要的朋友可以參考下
    2017-05-05
  • SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問題

    SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問題

    這篇文章主要介紹了SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)-動(dòng)態(tài)權(quán)限,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Kafka中的producer攔截器與consumer攔截器詳解

    Kafka中的producer攔截器與consumer攔截器詳解

    這篇文章主要介紹了Kafka中的producer攔截器與consumer攔截器詳解,Producer 的Interceptor使得用戶在消息發(fā)送前以及Producer回調(diào)邏輯前有機(jī)會(huì)對(duì)消息做 一些定制化需求,比如修改消息等,需要的朋友可以參考下
    2023-12-12

最新評(píng)論