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

Spring 中優(yōu)雅的獲取泛型信息的方法

 更新時(shí)間:2019年03月27日 11:41:14   作者:如夢(mèng)技術(shù)  
這篇文章主要介紹了Spring 中優(yōu)雅的獲取泛型信息的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

簡(jiǎn)介

Spring 源碼是個(gè)大寶庫(kù),我們能遇到的大部分工具在源碼里都能找到,所以筆者開(kāi)源的 mica 完全基于 Spring 進(jìn)行基礎(chǔ)增強(qiáng),不重復(fù)造輪子。今天我要分享的是在 Spring 中優(yōu)雅的獲取泛型。

獲取泛型

自己解析

我們之前的處理方式,代碼來(lái)源 vjtools(江南白衣)。

/**
 * 通過(guò)反射, 獲得Class定義中聲明的父類(lèi)的泛型參數(shù)的類(lèi)型.
 * 
 * 注意泛型必須定義在父類(lèi)處. 這是唯一可以通過(guò)反射從泛型獲得Class實(shí)例的地方.
 * 
 * 如無(wú)法找到, 返回Object.class.
 * 
 * 如public UserDao extends HibernateDao<User,Long>
 * 
 * @param clazz clazz The class to introspect
 * @param index the Index of the generic declaration, start from 0.
 * @return the index generic declaration, or Object.class if cannot be determined
 */
public static Class getClassGenericType(final Class clazz, final int index) {

  Type genType = clazz.getGenericSuperclass();

  if (!(genType instanceof ParameterizedType)) {
    logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
    return Object.class;
  }

  Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

  if ((index >= params.length) || (index < 0)) {
    logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
        + params.length);
    return Object.class;
  }
  if (!(params[index] instanceof Class)) {
    logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
    return Object.class;
  }

  return (Class) params[index];
}

ResolvableType 工具

從 Spring 4.0 開(kāi)始 Spring 中添加了 ResolvableType 工具,這個(gè)類(lèi)可以更加方便的用來(lái)回去泛型信息。
首先我們來(lái)看看官方示例:

private HashMap<Integer, List<String>> myMap;

public void example() {
  ResolvableType t = ResolvableType.forField(getClass().getDeclaredField("myMap"));
  t.getSuperType(); // AbstractMap<Integer, List<String>>
  t.asMap(); // Map<Integer, List<String>>
  t.getGeneric(0).resolve(); // Integer
  t.getGeneric(1).resolve(); // List
  t.getGeneric(1); // List<String>
  t.resolveGeneric(1, 0); // String
}

詳細(xì)說(shuō)明

構(gòu)造獲取 Field 的泛型信息

ResolvableType.forField(Field)

構(gòu)造獲取 Method 的泛型信息

ResolvableType.forMethodParameter(Method, int)

構(gòu)造獲取方法返回參數(shù)的泛型信息

ResolvableType.forMethodReturnType(Method)

構(gòu)造獲取構(gòu)造參數(shù)的泛型信息

ResolvableType.forConstructorParameter(Constructor, int)

構(gòu)造獲取類(lèi)的泛型信息

ResolvableType.forClass(Class)

構(gòu)造獲取類(lèi)型的泛型信息

ResolvableType.forType(Type)

構(gòu)造獲取實(shí)例的泛型信息

ResolvableType.forInstance(Object)

更多使用 Api 請(qǐng)查看,ResolvableType java doc: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/ResolvableType.html

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java8中的default關(guān)鍵字詳解

    Java8中的default關(guān)鍵字詳解

    這篇文章主要介紹了Java8中的default關(guān)鍵字詳解,在實(shí)現(xiàn)某個(gè)接口的時(shí)候,需要實(shí)現(xiàn)該接口所有的方法,這個(gè)時(shí)候default關(guān)鍵字就派上用場(chǎng)了。通過(guò)default關(guān)鍵字定義的方法,集成該接口的方法不需要去實(shí)現(xiàn)該方法,需要的朋友可以參考下
    2023-08-08
  • SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制的詳細(xì)教程

    SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制的詳細(xì)教程

    這篇文章主要介紹了SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析

    Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析

    這篇文章主要為大家介紹了Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java中Hutool克隆功能的使用

    Java中Hutool克隆功能的使用

    本文主要介紹了Java中Hutool克隆功能的使用,cn.hutool.core.clone.Cloneable?是Hutool中提供的一個(gè)接口,用于支持對(duì)象的深度克隆操作,下面就一起來(lái)介紹一下
    2024-04-04
  • Spring?Boot如何監(jiān)控SQL運(yùn)行情況?

    Spring?Boot如何監(jiān)控SQL運(yùn)行情況?

    Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot如何監(jiān)控SQL運(yùn)行情況的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 教你利用springboot集成swagger并生成接口文檔

    教你利用springboot集成swagger并生成接口文檔

    有很多小伙伴不會(huì)利用springboot集成swagger并生成接口文檔,今天特地整理了這篇文章,文中有非常詳細(xì)的代碼圖文介紹及代碼示例,對(duì)不會(huì)這個(gè)方法的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)

    Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)

    今天小編就為大家分享一篇關(guān)于Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例

    Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例

    這篇文章主要介紹了Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java多線(xiàn)程編程之使用thread類(lèi)創(chuàng)建線(xiàn)程

    java多線(xiàn)程編程之使用thread類(lèi)創(chuàng)建線(xiàn)程

    在Java中創(chuàng)建線(xiàn)程有兩種方法:使用Thread類(lèi)和使用Runnable接口。在使用Runnable接口時(shí)需要建立一個(gè)Thread實(shí)例
    2014-01-01
  • Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換講解

    Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換講解

    本文詳細(xì)講解了Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12

最新評(píng)論