- package cn.com.tcgroup.yunlu.commons;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 泛型工具类
- */
- public class GenericsUtils {
- /**
- * 通过反射,获得指定类的父类的泛型参数的实际类型. 如DaoSupport<Buyer>
- *
- * @param clazz
- * clazz 需要反射的类,该类必须继承范型父类
- * @param index
- * 泛型参数所在索引,从0开始.
- * @return 范型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
- * <code>Object.class</code>
- */
- @SuppressWarnings("unchecked")
- public static Class getSuperClassGenricType(Class clazz, int index) {
- Type genType = clazz.getGenericSuperclass();// 得到泛型父类
- // 如果没有实现ParameterizedType接口,即不支持泛型,直接返回Object.class
- if (!(genType instanceof ParameterizedType)) {
- return Object.class;
- }
- // 返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class, 如BuyerServiceBean extends
- // DaoSupport<Buyer,Contact>就返回Buyer和Contact类型
- Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
- if (index >= params.length || index < 0) {
- throw new RuntimeException("你输入的索引"
- + (index < 0 ? "不能小于0" : "超出了参数的总数"));
- }
- if (!(params[index] instanceof Class)) {
- return Object.class;
- }
- return (Class) params[index];
- }
- /**
- * 通过反射,获得指定类的父类的第一个泛型参数的实际类型. 如DaoSupport<Buyer>
- *
- * @param clazz
- * clazz 需要反射的类,该类必须继承泛型父类
- * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
- * <code>Object.class</code>
- */
- @SuppressWarnings("unchecked")
- public static Class getSuperClassGenricType(Class clazz) {
- return getSuperClassGenricType(clazz, 0);
- }
- /**
- * 通过反射,获得方法返回值泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){}
- *
- * @param Method
- * method 方法
- * @param int index 泛型参数所在索引,从0开始.
- * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
- * <code>Object.class</code>
- */
- @SuppressWarnings("unchecked")
- public static Class getMethodGenericReturnType(Method method, int index) {
- Type returnType = method.getGenericReturnType();
- if (returnType instanceof ParameterizedType) {
- ParameterizedType type = (ParameterizedType) returnType;
- Type[] typeArguments = type.getActualTypeArguments();
- if (index >= typeArguments.length || index < 0) {
- throw new RuntimeException("你输入的索引"
- + (index < 0 ? "不能小于0" : "超出了参数的总数"));
- }
- return (Class) typeArguments[index];
- }
- return Object.class;
- }
- /**
- * 通过反射,获得方法返回值第一个泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){}
- *
- * @param Method
- * method 方法
- * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
- * <code>Object.class</code>
- */
- @SuppressWarnings("unchecked")
- public static Class getMethodGenericReturnType(Method method) {
- return getMethodGenericReturnType(method, 0);
- }
- /**
- * 通过反射,获得方法输入参数第index个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String,
- * Buyer> maps, List<String> names){}
- *
- * @param Method
- * method 方法
- * @param int index 第几个输入参数
- * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回空集合
- */
- @SuppressWarnings("unchecked")
- public static List<Class> getMethodGenericParameterTypes(Method method,
- int index) {
- List<Class> results = new ArrayList<Class>();
- Type[] genericParameterTypes = method.getGenericParameterTypes();
- if (index >= genericParameterTypes.length || index < 0) {
- throw new RuntimeException("你输入的索引"
- + (index < 0 ? "不能小于0" : "超出了参数的总数"));
- }
- Type genericParameterType = genericParameterTypes[index];
- if (genericParameterType instanceof ParameterizedType) {
- ParameterizedType aType = (ParameterizedType) genericParameterType;
- Type[] parameterArgTypes = aType.getActualTypeArguments();
- for (Type parameterArgType : parameterArgTypes) {
- Class parameterArgClass = (Class) parameterArgType;
- results.add(parameterArgClass);
- }
- return results;
- }
- return results;
- }
- /**
- * 通过反射,获得方法输入参数第一个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, Buyer>
- * maps, List<String> names){}
- *
- * @param Method
- * method 方法
- * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回空集合
- */
- @SuppressWarnings("unchecked")
- public static List<Class> getMethodGenericParameterTypes(Method method) {
- return getMethodGenericParameterTypes(method, 0);
- }
- /**
- * 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names;
- *
- * @param Field
- * field 字段
- * @param int index 泛型参数所在索引,从0开始.
- * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
- * <code>Object.class</code>
- */
- @SuppressWarnings("unchecked")
- public static Class getFieldGenericType(Field field, int index) {
- Type genericFieldType = field.getGenericType();
- if (genericFieldType instanceof ParameterizedType) {
- ParameterizedType aType = (ParameterizedType) genericFieldType;
- Type[] fieldArgTypes = aType.getActualTypeArguments();
- if (index >= fieldArgTypes.length || index < 0) {
- throw new RuntimeException("你输入的索引"
- + (index < 0 ? "不能小于0" : "超出了参数的总数"));
- }
- return (Class) fieldArgTypes[index];
- }
- return Object.class;
- }
- /**
- * 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names;
- *
- * @param Field
- * field 字段
- * @param int index 泛型参数所在索引,从0开始.
- * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
- * <code>Object.class</code>
- */
- @SuppressWarnings("unchecked")
- public static Class getFieldGenericType(Field field) {
- return getFieldGenericType(field, 0);
- }
- }
- 浏览: 116006 次
- 性别:
- 来自: 合肥
文章分类
- 全部博客 (170)
- oracle (15)
- Jquery (8)
- FreeMarker (2)
- MyBatis (1)
- Struts2 (1)
- 多数据源 (3)
- Maven (1)
- JavaScript (16)
- ExtJs (9)
- JPA (1)
- Java (20)
- Spring (12)
- Eclipse (1)
- SpringMVC (5)
- 经验与感悟 (6)
- JqGrid (1)
- 源代码 (7)
- 多线程 (7)
- Effective Java (7)
- 架构 (10)
- 设计模式 (3)
- jbpm (0)
- lucene (0)
- junit (1)
- Java工具 (11)
- Hibernate (3)
- Jquery-Easyui (1)
- web优化 (2)
- cas (2)
- linux (5)
- Activiti (0)
- Nginx (3)
发表评论
-
MyEclipse10破解
2016-04-28 09:39 368打开run.bat 出现此控制台,不要关掉,立即会出现再 ... -
关于SVN 目录结构
2015-12-15 09:11 385Subversion有一个很标准 ... -
shell实现自动更新java web项目到Tomcat
2014-11-05 10:59 1782动弹里求助了下如何自动更新java web项目到Tomcat ... -
利用shell自动化打包java工程
2014-11-05 10:54 623Java代码 #!/bin/bash ... -
jrebel使用
2014-11-05 10:48 498背景与愿景:开发环境 ... -
项目经验分享——Java常用工具类集合
2014-02-08 11:03 971写在前面 本文涉及的工具类部分是自己编写,另一部分是 ... -
开源工具 — Apache Commons Lang(2)
2014-02-08 10:58 648很多情况下我们都需要将字符串转换为数字,或判断字符串是否是 ... -
开源工具 — Apache Commons Lang(1)
2014-02-08 10:57 501相信Apache的大名各位一定不会陌生,Java领域中常用的 ... -
java反射工具类
2014-02-07 21:49 1516import java.lang.reflect.Field ... -
实用的Java反射工具类
2014-02-07 21:43 1498
相关推荐
### 泛型工具类在IT行业的应用与理解 在现代软件开发中,泛型作为一种强大的类型安全机制,被广泛应用于各种编程语言中,尤其是Java。泛型允许开发者编写灵活且可重用的代码,同时避免了运行时类型检查错误。在Java...
在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...
### 泛型和泛型集合类用法详解 #### 一、泛型基础概念 泛型是现代编程语言中的一项重要特性,它允许开发者在不指定具体数据类型的情况下编写类或方法,从而达到代码重用的目的。在.NET Framework 2.0及以后版本中...
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照
泛型内容包括泛型作为方法参数、自定义泛型类和自定义泛型方法等。 1. 泛型作为方法参数 泛型作为方法参数可以使用通配符,例如: public void sellGoods(List<? extends Goods> goods) 这里的?extends Goods...
C#中的泛型类是编程中的一个重要概念,它允许我们创建可以处理多种数据类型的类,提高了代码的重用性和效率。下面将详细讲解泛型类的各个方面。 1. **泛型类的基本应用** 泛型类的核心在于类型参数,这使得类能够...
在Java编程语言中,泛型是一种强大的特性,它允许我们在类、接口和方法中使用类型参数,从而提高代码的灵活性和安全性。当我们谈论“继承泛型类”时,这意味着一个类(子类)正在扩展一个已经定义了泛型的类(父类)...
很好用的C#读写缓存泛型公共类,C#获取 创建 修改缓存泛型公共方法
2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip...
当我们谈论继承非泛型类时,意味着子类继承了一个没有使用泛型的父类。泛型是Java SE 5.0引入的新特性,用于提供类型安全和减少强制类型转换,但并不是所有类都必须使用泛型。 非泛型类通常定义为不包含类型参数的...
3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3....
总结,泛型是C#中提高代码重用性和效率的关键工具。通过使用泛型类、方法、接口和委托,我们可以编写灵活且类型安全的代码,适用于多种数据类型,同时减少运行时类型检查和转换的成本。在实际开发中,熟练掌握泛型能...
在C#编程语言中,泛型是面向对象编程的一...总的来说,C#中的泛型类和继承机制相结合,为开发者提供了强大的工具来构建模块化和高效的代码。通过理解并熟练运用这些概念,你可以编写出更易于维护、扩展和复用的C#程序。
通过编写泛型类和使用递归,我们可以创建一个灵活且强大的工具,不仅可以处理简单的对象,还可以处理包含嵌套类和可能的递归结构的对象。在实际应用中,这样的工具对于数据持久化、跨平台通信等场景都非常有用。
本示例将探讨如何在Java中实现泛型类的类型识别。 首先,我们来理解什么是类型识别(Runtime Type Information, RTTI)。在Java中,RTTI允许我们在程序运行时检查和操作对象的实际类型,这是通过使用`instanceof`...
总结来说,泛型是Java编程中提高代码安全性和可维护性的重要工具。正确理解和使用泛型,能有效防止类型转换异常,增强代码的灵活性。在设计类和方法时,考虑是否可以引入泛型,将使代码更加健壮和易于理解。
C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON
对于框架设计者来说,便捷的代码,是很重要的一部分。 反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。...希望能帮助那些为查找泛型构造器、非静态内部泛型类的对象生成而烦恼的童鞋。
通过反射创建带有泛型参数的类 1.Limin.Reflector.DLL中的BaseDal.cs里包含要创建的带泛型参数的类 2.Limin.Reflector.Invoke中的Factory.cs完成泛型类的创建 代码写的不是很好,不足之处,请多多指教
介绍获取方法的参数和返回值类型(包括Type和Class)获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)方法首先我们定义一个类:public cla