首頁  >  文章  >  Java  >  Spring中獲取泛型資訊的技巧方法

Spring中獲取泛型資訊的技巧方法

不言
不言轉載
2019-03-27 10:24:322726瀏覽

這篇文章帶給大家的內容是關於Spring中獲取泛型資訊的技巧方法,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

簡介:Spring 原始碼是個大寶庫,我們能遇到的大部分工具在原始碼裡都能找到,所以筆者開源的 mica 完全基於 Spring 進行基礎增強,不重複造輪子。今天我要分享的是在 Spring 中優雅的獲取泛型。

取得泛型

自己解析

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

/**
 * 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
 * 
 * 注意泛型必须定义在父类处. 这是唯一可以通过反射从泛型获得Class实例的地方.
 * 
 * 如无法找到, 返回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() + "&#39;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 開始 Spring 中加入了 ResolvableType 工具,這個類別可以更方便的用來回傳泛型資訊。
首先我們來看看官方範例:

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
}

詳細說明

建構取得Field 的泛型資訊

ResolvableType.forField(Field)

建構取得Method 的泛型資訊

ResolvableType.forMethodParameter(Method, int)

建構獲取方法傳回參數的泛型資訊

ResolvableType.forMethodReturnType(Method)

建構取得建構參數的泛型資訊

ResolvableType.forConstructorParameter(Constructor, int)

建構取得類別的泛型資訊

ResolvableType.forClass(Class)

。取得類型的泛型資訊

ResolvableType.forType(Type)

建構取得實例的泛型資訊

ResolvableType.forInstance(Object)

更多使用Api 請查看,ResolvableType java doc: https://docs.spring.io/spring. ..

這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的Java視頻教程欄目!

#

以上是Spring中獲取泛型資訊的技巧方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除