简介

Spring 源码是个大宝库,我们能遇到的大部分工具在源码里都能找到,所以笔者开源的 mica[1] 完全基于 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)

©著作权归作者所有:来自51CTO博客作者轮子工厂的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 用 Python 自动定时发微博
  2. 利用AJAX实现一个无刷新的分页功能
  3. 构造函数、原型、dom基础
  4. PHP数据库实操:无刷新分页和编辑删除功能
  5. IntelliJ IDEA 激活码 2021.02.28日更新
  6. JavaScript初学习之构造函数、类与继承、获取dom元素、dom元素的
  7. 详解微信小程序登录wx.login(Object object)
  8. 微信小程序实现带参分享并消息卡片获取参数
  9. Centos7最小安装完成后,ifconfig命令用不了。

随机推荐

  1. Android Gradle 指南
  2. Android -- adb devices找不到设备的解决
  3. Android横竖屏总结(转)
  4. android.net.wifi Kotlin |Java
  5. Android中使用XmlPullParse解析xml文件
  6. 亲试,Windows平台上使用Qt5.2.1编写Androi
  7. 【Android Api 翻译1】Android Texting(2)T
  8. 史上最全!押题率90%的 Android(安卓)中高
  9. Android(安卓)colors.xml (颜色大全)
  10. Android Activity去除标题栏和状态栏