摘要:今天我要分享的是在中优雅的获取泛型。通过反射获得定义中声明的父类的泛型参数的类型注意泛型必须定义在父类处这是唯一可以通过反射从泛型获得实例的地方如无法找到返回如工具从开始中添加了工具,这个类可以更加方便的用来回去泛型信息。
简介
Spring 源码是个大宝库,我们能遇到的大部分工具在源码里都能找到,所以笔者开源的 mica 完全基于 Spring 进行基础增强,不重复造轮子。今天我要分享的是在 Spring 中优雅的获取泛型。
获取泛型 自己解析我们之前的处理方式,代码来源 vjtools(江南白衣)。
/** * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. * * 注意泛型必须定义在父类处. 这是唯一可以通过反射从泛型获得Class实例的地方. * * 如无法找到, 返回Object.class. * * 如public UserDao extends HibernateDaoResolvableType 工具* * @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]; }
从 Spring 4.0 开始 Spring 中添加了 ResolvableType 工具,这个类可以更加方便的用来回去泛型信息。
首先我们来看看官方示例:
private HashMap详细说明 构造获取 Field 的泛型信息> myMap; public void example() { ResolvableType t = ResolvableType.forField(getClass().getDeclaredField("myMap")); t.getSuperType(); // AbstractMap > t.asMap(); // Map > t.getGeneric(0).resolve(); // Integer t.getGeneric(1).resolve(); // List t.getGeneric(1); // List t.resolveGeneric(1, 0); // String }
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...
开源推荐Spring boot 微服务高效开发 mica 工具集:https://gitee.com/596392912/mica
Avue 一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue
pig 宇宙最强微服务(架构师必备):https://gitee.com/log4j/pig
SpringBlade 完整的线上解决方案(企业开发必备):https://gitee.com/smallc/SpringBlade
IJPay 支付SDK让支付触手可及:https://gitee.com/javen205/IJPay
加入【如梦技术】Spring QQ群:479710041,了解更多。
关注我们扫描上面二维码,更多精彩内容每天推荐!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73957.html
摘要:第章元编程与注解反射反射是在运行时获取类的函数方法属性父类接口注解元数据泛型信息等类的内部信息的机制。本章介绍中的注解与反射编程的相关内容。元编程本质上是一种对源代码本身进行高层次抽象的编码技术。反射是促进元编程的一种很有价值的语言特性。 第12章 元编程与注解、反射 反射(Reflection)是在运行时获取类的函数(方法)、属性、父类、接口、注解元数据、泛型信息等类的内部信息的机...
摘要:以下内容基于如果你使用的也是相同的技术栈可以继续往下阅读,如果不是可以当作参考。编写的四种方式裸写最简单最粗暴也是使用最多的一种方式,在写的多了之后可以用生成工具生成。 导读 在目前接触过的项目中大多数的项目都会涉及到: crud相关的操作, 哪如何优雅的编写crud操作呢?带着这个问题,我们发现项目中大量的操作多是 创建实体 、删除实例、 修改实体、 查询单个实体、 分页查询多个实体...
摘要:实践很简单的一个类,点开它的源代码,其中所有的方法都是与相关联的。从而很好地避免了空指针异常。方法,如果存在,返回包含的值,否则抛出异常。随便点开一个方法,都会在第一行为不该为的参数进行判断。 问题描述 在大热的Spring Boot 2.0中,在将原来的泛型改为了Optional,旨在让我们的代码更简洁。 showImg(https://segmentfault.com/img/bV...
摘要:引用泛型除了方法因不能使用外部实例参数外,其他继承实现成员变量,成员方法,方法返回值等都可使用。因此,生成的字节码仅包含普通的类,接口和方法。 为什么要使用泛型程序设计? 一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类的对应类型;如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----摘自原书Ordinary classes and meth...
阅读 1499·2021-11-23 09:51
阅读 3577·2021-09-26 09:46
阅读 2103·2021-09-22 10:02
阅读 1766·2019-08-30 15:56
阅读 3295·2019-08-30 12:51
阅读 2190·2019-08-30 11:12
阅读 2026·2019-08-29 13:23
阅读 2301·2019-08-29 13:16