這篇文章帶給大家的內容是關於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() + "'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中文網其他相關文章!