您好,登錄后才能下訂單哦!
簡介
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() + "'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-framework/docs/current/javadoc-api/org/springframework/core/ResolvableType.html
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。