`

泛型工具类GenericsUtils

 
阅读更多
  1. package cn.com.tcgroup.yunlu.commons;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.ParameterizedType;  
  6. import java.lang.reflect.Type;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. /** 
  11.  * 泛型工具类 
  12.  */  
  13. public class GenericsUtils {  
  14.     /** 
  15.      * 通过反射,获得指定类的父类的泛型参数的实际类型. 如DaoSupport<Buyer> 
  16.      *  
  17.      * @param clazz 
  18.      *            clazz 需要反射的类,该类必须继承范型父类 
  19.      * @param index 
  20.      *            泛型参数所在索引,从0开始. 
  21.      * @return 范型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 
  22.      *         <code>Object.class</code> 
  23.      */  
  24.     @SuppressWarnings("unchecked")  
  25.     public static Class getSuperClassGenricType(Class clazz, int index) {  
  26.   
  27.         Type genType = clazz.getGenericSuperclass();// 得到泛型父类  
  28.   
  29.         // 如果没有实现ParameterizedType接口,即不支持泛型,直接返回Object.class  
  30.         if (!(genType instanceof ParameterizedType)) {  
  31.   
  32.             return Object.class;  
  33.         }  
  34.   
  35.         // 返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class, 如BuyerServiceBean extends  
  36.         // DaoSupport<Buyer,Contact>就返回Buyer和Contact类型  
  37.         Type[] params = ((ParameterizedType) genType).getActualTypeArguments();  
  38.         if (index >= params.length || index < 0) {  
  39.   
  40.             throw new RuntimeException("你输入的索引"  
  41.                     + (index < 0 ? "不能小于0" : "超出了参数的总数"));  
  42.         }  
  43.         if (!(params[index] instanceof Class)) {  
  44.   
  45.             return Object.class;  
  46.         }  
  47.         return (Class) params[index];  
  48.     }  
  49.   
  50.     /** 
  51.      * 通过反射,获得指定类的父类的第一个泛型参数的实际类型. 如DaoSupport<Buyer> 
  52.      *  
  53.      * @param clazz 
  54.      *            clazz 需要反射的类,该类必须继承泛型父类 
  55.      * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 
  56.      *         <code>Object.class</code> 
  57.      */  
  58.     @SuppressWarnings("unchecked")  
  59.     public static Class getSuperClassGenricType(Class clazz) {  
  60.   
  61.         return getSuperClassGenricType(clazz, 0);  
  62.     }  
  63.   
  64.     /** 
  65.      * 通过反射,获得方法返回值泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){} 
  66.      *  
  67.      * @param Method 
  68.      *            method 方法 
  69.      * @param int index 泛型参数所在索引,从0开始. 
  70.      * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 
  71.      *         <code>Object.class</code> 
  72.      */  
  73.     @SuppressWarnings("unchecked")  
  74.     public static Class getMethodGenericReturnType(Method method, int index) {  
  75.   
  76.         Type returnType = method.getGenericReturnType();  
  77.   
  78.         if (returnType instanceof ParameterizedType) {  
  79.   
  80.             ParameterizedType type = (ParameterizedType) returnType;  
  81.             Type[] typeArguments = type.getActualTypeArguments();  
  82.   
  83.             if (index >= typeArguments.length || index < 0) {  
  84.   
  85.                 throw new RuntimeException("你输入的索引"  
  86.                         + (index < 0 ? "不能小于0" : "超出了参数的总数"));  
  87.             }  
  88.             return (Class) typeArguments[index];  
  89.         }  
  90.         return Object.class;  
  91.     }  
  92.   
  93.     /** 
  94.      * 通过反射,获得方法返回值第一个泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){} 
  95.      *  
  96.      * @param Method 
  97.      *            method 方法 
  98.      * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 
  99.      *         <code>Object.class</code> 
  100.      */  
  101.     @SuppressWarnings("unchecked")  
  102.     public static Class getMethodGenericReturnType(Method method) {  
  103.   
  104.         return getMethodGenericReturnType(method, 0);  
  105.     }  
  106.   
  107.     /** 
  108.      * 通过反射,获得方法输入参数第index个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, 
  109.      * Buyer> maps, List<String> names){} 
  110.      *  
  111.      * @param Method 
  112.      *            method 方法 
  113.      * @param int index 第几个输入参数 
  114.      * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回空集合 
  115.      */  
  116.     @SuppressWarnings("unchecked")  
  117.     public static List<Class> getMethodGenericParameterTypes(Method method,  
  118.             int index) {  
  119.   
  120.         List<Class> results = new ArrayList<Class>();  
  121.         Type[] genericParameterTypes = method.getGenericParameterTypes();  
  122.   
  123.         if (index >= genericParameterTypes.length || index < 0) {  
  124.   
  125.             throw new RuntimeException("你输入的索引"  
  126.                     + (index < 0 ? "不能小于0" : "超出了参数的总数"));  
  127.         }  
  128.         Type genericParameterType = genericParameterTypes[index];  
  129.   
  130.         if (genericParameterType instanceof ParameterizedType) {  
  131.   
  132.             ParameterizedType aType = (ParameterizedType) genericParameterType;  
  133.             Type[] parameterArgTypes = aType.getActualTypeArguments();  
  134.             for (Type parameterArgType : parameterArgTypes) {  
  135.                 Class parameterArgClass = (Class) parameterArgType;  
  136.                 results.add(parameterArgClass);  
  137.             }  
  138.             return results;  
  139.         }  
  140.         return results;  
  141.     }  
  142.   
  143.     /** 
  144.      * 通过反射,获得方法输入参数第一个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, Buyer> 
  145.      * maps, List<String> names){} 
  146.      *  
  147.      * @param Method 
  148.      *            method 方法 
  149.      * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回空集合 
  150.      */  
  151.     @SuppressWarnings("unchecked")  
  152.     public static List<Class> getMethodGenericParameterTypes(Method method) {  
  153.   
  154.         return getMethodGenericParameterTypes(method, 0);  
  155.     }  
  156.   
  157.     /** 
  158.      * 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names; 
  159.      *  
  160.      * @param Field 
  161.      *            field 字段 
  162.      * @param int index 泛型参数所在索引,从0开始. 
  163.      * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 
  164.      *         <code>Object.class</code> 
  165.      */  
  166.     @SuppressWarnings("unchecked")  
  167.     public static Class getFieldGenericType(Field field, int index) {  
  168.   
  169.         Type genericFieldType = field.getGenericType();  
  170.   
  171.         if (genericFieldType instanceof ParameterizedType) {  
  172.   
  173.             ParameterizedType aType = (ParameterizedType) genericFieldType;  
  174.             Type[] fieldArgTypes = aType.getActualTypeArguments();  
  175.             if (index >= fieldArgTypes.length || index < 0) {  
  176.   
  177.                 throw new RuntimeException("你输入的索引"  
  178.                         + (index < 0 ? "不能小于0" : "超出了参数的总数"));  
  179.             }  
  180.             return (Class) fieldArgTypes[index];  
  181.         }  
  182.         return Object.class;  
  183.     }  
  184.   
  185.     /** 
  186.      * 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names; 
  187.      *  
  188.      * @param Field 
  189.      *            field 字段 
  190.      * @param int index 泛型参数所在索引,从0开始. 
  191.      * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 
  192.      *         <code>Object.class</code> 
  193.      */  
  194.     @SuppressWarnings("unchecked")  
  195.     public static Class getFieldGenericType(Field field) {  
  196.   
  197.         return getFieldGenericType(field, 0);  
  198.     }  

分享到:
评论

相关推荐

    泛型工具类

    ### 泛型工具类在IT行业的应用与理解 在现代软件开发中,泛型作为一种强大的类型安全机制,被广泛应用于各种编程语言中,尤其是Java。泛型允许开发者编写灵活且可重用的代码,同时避免了运行时类型检查错误。在Java...

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...

    泛型和泛型集合类用法

    ### 泛型和泛型集合类用法详解 #### 一、泛型基础概念 泛型是现代编程语言中的一项重要特性,它允许开发者在不指定具体数据类型的情况下编写类或方法,从而达到代码重用的目的。在.NET Framework 2.0及以后版本中...

    【Flutter】Dart 泛型 ( 泛型类 泛型方法 特定类型约束的泛型 ).zip

    【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照

    详解Java常用工具类—泛型

    泛型内容包括泛型作为方法参数、自定义泛型类和自定义泛型方法等。 1. 泛型作为方法参数 泛型作为方法参数可以使用通配符,例如: public void sellGoods(List&lt;? extends Goods&gt; goods) 这里的?extends Goods...

    浅谈c# 泛型类的应用

    C#中的泛型类是编程中的一个重要概念,它允许我们创建可以处理多种数据类型的类,提高了代码的重用性和效率。下面将详细讲解泛型类的各个方面。 1. **泛型类的基本应用** 泛型类的核心在于类型参数,这使得类能够...

    java 继承泛型类示例

    在Java编程语言中,泛型是一种强大的特性,它允许我们在类、接口和方法中使用类型参数,从而提高代码的灵活性和安全性。当我们谈论“继承泛型类”时,这意味着一个类(子类)正在扩展一个已经定义了泛型的类(父类)...

    C#读写缓存泛型公共类

    很好用的C#读写缓存泛型公共类,C#获取 创建 修改缓存泛型公共方法

    2.java定义泛型类.zip

    2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip...

    java 继承非泛型类示例

    当我们谈论继承非泛型类时,意味着子类继承了一个没有使用泛型的父类。泛型是Java SE 5.0引入的新特性,用于提供类型安全和减少强制类型转换,但并不是所有类都必须使用泛型。 非泛型类通常定义为不包含类型参数的...

    3.java实例化泛型类.zip

    3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3....

    c#泛型类、泛型方法、泛型接口、泛型委托

    总结,泛型是C#中提高代码重用性和效率的关键工具。通过使用泛型类、方法、接口和委托,我们可以编写灵活且类型安全的代码,适用于多种数据类型,同时减少运行时类型检查和转换的成本。在实际开发中,熟练掌握泛型能...

    c#使用 和 继承 泛型类

    在C#编程语言中,泛型是面向对象编程的一...总的来说,C#中的泛型类和继承机制相结合,为开发者提供了强大的工具来构建模块化和高效的代码。通过理解并熟练运用这些概念,你可以编写出更易于维护、扩展和复用的C#程序。

    c# 泛型保存类结构,支持递归

    通过编写泛型类和使用递归,我们可以创建一个灵活且强大的工具,不仅可以处理简单的对象,还可以处理包含嵌套类和可能的递归结构的对象。在实际应用中,这样的工具对于数据持久化、跨平台通信等场景都非常有用。

    java 泛型类的类型识别示例

    本示例将探讨如何在Java中实现泛型类的类型识别。 首先,我们来理解什么是类型识别(Runtime Type Information, RTTI)。在Java中,RTTI允许我们在程序运行时检查和操作对象的实际类型,这是通过使用`instanceof`...

    泛型用在类和方法上的写法

    总结来说,泛型是Java编程中提高代码安全性和可维护性的重要工具。正确理解和使用泛型,能有效防止类型转换异常,增强代码的灵活性。在设计类和方法时,考虑是否可以引入泛型,将使代码更加健壮和易于理解。

    C# 工具类 泛型转JSON(Newtonsoft.Json)

    C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON

    利用反射生成泛型类对象

    对于框架设计者来说,便捷的代码,是很重要的一部分。 反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。...希望能帮助那些为查找泛型构造器、非静态内部泛型类的对象生成而烦恼的童鞋。

    反射创建泛型类

    通过反射创建带有泛型参数的类 1.Limin.Reflector.DLL中的BaseDal.cs里包含要创建的带泛型参数的类 2.Limin.Reflector.Invoke中的Factory.cs完成泛型类的创建 代码写的不是很好,不足之处,请多多指教

    looly#hutool-site#泛型类型工具-TypeUtil1

    介绍获取方法的参数和返回值类型(包括Type和Class)获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)方法首先我们定义一个类:public cla

Global site tag (gtag.js) - Google Analytics