package cn.yisi.utils;
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;
/**
* 泛型工具类
* @author lihuoming
*
*/
public class GenericsUtils {
/**
* 通过反射,获得指定类的父类的泛型参数的实际类型. 如BuyerServiceBean extends 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];
}
/**
* 通过反射,获得指定类的父类的第一个泛型参数的实际类型. 如BuyerServiceBean extends 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);
}
}
分享到:
相关推荐
泛型内容包括泛型作为方法参数、自定义泛型类和自定义泛型方法等。 1. 泛型作为方法参数 泛型作为方法参数可以使用通配符,例如: public void sellGoods(List<? extends Goods> goods) 这里的?extends Goods...
为了提高代码的可重用性和可维护性,泛型工具类的使用变得尤为重要。本篇将详细介绍如何利用泛型和Hibernate ORM技术实现一个通用的帮助类,以便在处理相同实体类属性的新增和修改时,通过同一接口进行操作。 首先...
在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...
通过将公共通用操作写进父类简化代码,提高代码的复用。 面向接口 使用继承 泛型 引入JPA API查询 以及 元数据 提高代码的安全性.
6. **泛型工具类**:如GenericUtil,可能包含一些泛型相关的辅助方法,如类型转换、泛型安全的数组创建等,这些在处理泛型时非常有用。 7. **数学计算工具类**:如MathUtil,可能包含各种数学运算,如取模、平方根...
总结,泛型是C#中提高代码重用性和效率的关键工具。通过使用泛型类、方法、接口和委托,我们可以编写灵活且类型安全的代码,适用于多种数据类型,同时减少运行时类型检查和转换的成本。在实际开发中,熟练掌握泛型能...
在C#编程语言中,泛型是面向对象编程的一...总的来说,C#中的泛型类和继承机制相结合,为开发者提供了强大的工具来构建模块化和高效的代码。通过理解并熟练运用这些概念,你可以编写出更易于维护、扩展和复用的C#程序。
C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON
通过编写泛型类和使用递归,我们可以创建一个灵活且强大的工具,不仅可以处理简单的对象,还可以处理包含嵌套类和可能的递归结构的对象。在实际应用中,这样的工具对于数据持久化、跨平台通信等场景都非常有用。
总结来说,泛型是Java编程中提高代码安全性和可维护性的重要工具。正确理解和使用泛型,能有效防止类型转换异常,增强代码的灵活性。在设计类和方法时,考虑是否可以引入泛型,将使代码更加健壮和易于理解。
在Java编程语言中,泛型(Generics)是自Java 5版本引入的一项重要特性,它允许我们在类、接口和方法中使用类型参数,从而提高了代码的可...在实际项目中,这样的泛型工具类可以极大地提升代码的可维护性和可扩展性。
介绍获取方法的参数和返回值类型(包括Type和Class)获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)方法首先我们定义一个类:public cla
8. **泛型工具类**: - `GenericsUtils`:处理泛型相关的操作,如类型判断、类型转换、创建泛型实例等。 这些工具类的使用能够极大地提升开发效率,减少出错概率,让开发者更专注于业务逻辑而不是基础操作。在实际...
这个实例185可能是进一步讨论泛型数组类如何应用于实际项目,例如作为缓存、队列或其他数据结构的基础,或者作为工具类帮助处理不同类型的数据集。标签中的"源码"表明可能有具体的代码实现供学习,而"工具"可能意味...
包含获得各种集合对象的常用方法的泛型工具类。如果要获得一个 {@code Map<String, String>} 的对象,可以通过下面的方式实现: * {@literal Map<String, String> map = GenericUtils.getMap() }。但是...
在这个“TypeScript泛型类 - 把类作为参数类型的泛型类”示例中,我们将深入探讨如何利用泛型在TypeScript中创建灵活的、可复用的类模板。 泛型是TypeScript中的一个核心概念,它允许我们在编写代码时定义和重用...
在TypeScript中,泛型是一种强大的工具,它允许我们在编写代码时定义可重用的数据类型模板,从而提高代码的灵活性和可复用性。泛型是TypeScript的一大特色,它在许多面向对象的设计模式和数据结构中发挥着关键作用。...
在Java等面向对象的语言中,泛型是一种强大的工具,它允许我们在集合类中使用多种类型的元素,同时保持类型安全。本话题将探讨如何实现一个泛型类集合,特别是实现一个双向链表,并提供相关的方法,如求表长度。 ...
Java 泛型是一种强大的语言特性,自JDK 5.0引入以来,极大地提升了代码的类型安全性以及重用性。泛型允许我们在类、接口和方法中使用类型参数,这样在编译...在设计复杂的数据结构或容器类时,泛型是必不可少的工具。