热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Spring中优雅的获取泛型信息的方法

这篇文章主要介绍了Spring中优雅的获取泛型信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

简介

Spring 源码是个大宝库,我们能遇到的大部分工具在源码里都能找到,所以笔者开源的 mica 完全基于 Spring 进行基础增强,不重复造轮子。今天我要分享的是在 Spring 中优雅的获取泛型。

获取泛型

自己解析

我们之前的处理方式,代码来源 vjtools(江南白衣)。

/**
 * 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
 * 
 * 注意泛型必须定义在父类处. 这是唯一可以通过反射从泛型获得Class实例的地方.
 * 
 * 如无法找到, 返回Object.class.
 * 
 * 如public UserDao extends HibernateDao
 * 
 * @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> 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
}

详细说明

构造获取 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文基于Robert C. Martin在其著作《清洁代码》第17章中的观点,深入分析了代码实践中常见的‘代码气味’现象,并提出了改进方法实现的具体建议。 ... [详细]
  • Linux 存储堆栈架构图
    本文提供了一张清晰的Linux存储堆栈架构图,并对比了多种iSCSI后端解决方案,如LIO和STGT。文中还提供了详细的资源链接,帮助读者深入了解这些技术。 ... [详细]
  • 远程访问用户 Kindle通过电子书实现控制
    介绍自2007年以来,亚马逊已售出数千万台Kindle,令人印象深刻。但这也意味着数以千万计的人可能会因为这些Kindle中的软件漏洞而被黑客入侵。他 ... [详细]
  • Linux系统中高效解决高Buff/Cache占用问题
    本文详细探讨了在Linux系统中遇到的高Buff/Cache占用问题及其解决方案,提供了手动清除与定时任务自动化处理的方法。 ... [详细]
  • 本文介绍了FTP(文件传输协议)的基础知识,包括其定义、如何通过TCP建立控制和数据连接,以及主动模式与被动模式的区别。FTP作为一种重要的文件传输协议,在互联网数据交换中扮演着关键角色。 ... [详细]
  • 深入理解SAP Fiori及其核心概念
    本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ... [详细]
  • Windows 10 上 Python 环境的配置方法
    本文详细介绍了如何在 Windows 10 系统上安装并配置 Python 环境,包括环境变量的设置,以确保 Python 可以在命令行中顺利运行。 ... [详细]
  • 本文总结了在使用React Native开发过程中遇到的一些常见问题及其解决方法,包括配置错误、依赖问题和特定组件的使用技巧。 ... [详细]
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • 本文介绍了如何利用MATLAB进行多张图片的拼接与合并操作,包括SIFT特征点的检测、描述符的生成、特征匹配以及通过RANSAC算法实现图像间的仿射变换等关键技术。 ... [详细]
  • 本文将详细介绍软件工程中的三种重要创建型设计模式:简单工厂模式、工厂方法模式以及抽象工厂模式。通过实例分析,帮助读者更好地理解和应用这些模式。 ... [详细]
  • Nibblestutotials.net教程 – Blend  Silverlight1系列之Button Basic
    Basic:createonebutton文中三部分所用资源及代码下载:part1,part2,part3Buttonsbasicpart1:drawingNibbl ... [详细]
  • 在使用Hibernate Validator时,遇到HV000030错误提示,这通常与验证注解的选择和使用不当有关。本文将详细介绍@NotNull、@NotEmpty和@NotBlank这三个注解的区别及其正确应用场景。 ... [详细]
  • 查找数组中的重复元素
    问题描述:给定一个长度为n的数组,其中所有元素值位于0至n-1之间。数组中存在一些重复的数字,但具体哪些数字重复以及重复了多少次未知。本文章将探讨如何高效地找到数组中的任一重复数字。 ... [详细]
  • 本文详细介绍了如何利用go-zero框架从需求分析到最终部署至Kubernetes的全过程,特别聚焦于微服务架构中的网关设计与实现。项目采用了go-zero及其生态组件,涵盖了从API设计到RPC调用,再到生产环境下的监控与维护等多方面内容。 ... [详细]
author-avatar
兔子是不常吃萝卜的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有