/**
* 泛型
* 解析父类泛型参数的实际类型
* 解析方法返回值泛型参数的实际类型
*/
package com.hyb.util.generics;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class GennericsUtil {
private static final Log log = LogFactory.getLog(GennericsUtil.class);//需要引入日志包
/**
*
* 通过反射获取指定类的父类泛型参数的实际类型,
* 如XXXDao extends BaseDao<Integer>中得到Integer的类型
* @param clazz 需要找出其父类泛型参数的类
* @param index 参数下标
* @return 返回对应参数类型对象
*/
public static Class<?> getSuperGenericsType(Class<?> clazz, int index) {
Type gType = clazz.getGenericSuperclass(); //返回clazz对象的的父类的 Type
if(!(gType instanceof ParameterizedType)) { //查看gType是否是ParameterizedType类型,如不是,则不支持泛型
log.info(clazz.getName() + "的父类不是ParameterizedType类型");
return Object.class;
}
Type[] gParamsType = ((ParameterizedType)gType).getActualTypeArguments(); //返回表示此类型实际类型参数的 Type 对象的数组BaseDao<Integer>中的Integer
if(index < 0 || index >= gParamsType.length) {
log.info("参数index越界或者有错!");
return Object.class;
}
if(!(gParamsType[index] instanceof Class<?>)) {
return Object.class;
}
return (Class<?>)gParamsType[index]; //返回该泛型参数对象
}
/**
*
* 通过反射获取指定类的父类泛型参数的实际类型,
* 如XXXDao extends BaseDao<Integer>中得到Integer的类型
* @param clazz 需要找出其父类泛型参数的类
* @return 返回第一个参数类型对象
*/
public static Class<?> getSuperGenericsType(Class<?> clazz) {
return getSuperGenericsType(clazz, 0);
}
/**
*
* 通过反射获取指定的方法返回值泛型参数的实际类型,
* 如Map<String, String> getMap()中得到String的类型
* @param method 指定的方法
* @param index
* @return 返回参数实际类型对象
*/
public static Class<?> getMethodReturnGenericType(Method method, int index) {
Type rType = method.getGenericReturnType();//method对象所表示方法的实际返回类型的 Type对象
if(!(rType instanceof ParameterizedType)) {
return Object.class;
}
Type[] rParamsType = ((ParameterizedType)rType).getActualTypeArguments();//返回表示此类型实际类型参数的 Type对象的数组,如Map<String, String>中的String
if(index < 0 || index >= rParamsType.length) {
log.info("参数index越界或者有错!");
return Object.class;
}
if(!(rParamsType[index] instanceof Class<?>)) {
return Object.class;
}
return (Class<?>)rParamsType[index];
}
/**
*
* 通过反射获取指定的方法返回值泛型参数的实际类型,
* 如Map<String, String> getMap()中得到String的类型
* @param method
* @return 返回第一个参数实际类型
*/
public static Class<?> getMethodReturnGenericType(Method method) {
return getMethodReturnGenericType(method, 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引入以来,极大地提升了代码的类型安全性以及重用性。泛型允许我们在类、接口和方法中使用类型参数,这样在编译...在设计复杂的数据结构或容器类时,泛型是必不可少的工具。