`
halbert918
  • 浏览: 4269 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

泛型工具类

 
阅读更多
/**
 * 泛型
 * 解析父类泛型参数的实际类型
 * 解析方法返回值泛型参数的实际类型
 */
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);
	}
}
分享到:
评论

相关推荐

    详解Java常用工具类—泛型

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

    java Spring mvc 新增和修改的泛型帮助类,用同一接口修改相同实体类的属性

    为了提高代码的可重用性和可维护性,泛型工具类的使用变得尤为重要。本篇将详细介绍如何利用泛型和Hibernate ORM技术实现一个通用的帮助类,以便在处理相同实体类属性的新增和修改时,通过同一接口进行操作。 首先...

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

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

    封装JPA的数据操作公共DAO基类

    通过将公共通用操作写进父类简化代码,提高代码的复用。 面向接口 使用继承 泛型 引入JPA API查询 以及 元数据 提高代码的安全性.

    java工具类28+26.rar

    6. **泛型工具类**:如GenericUtil,可能包含一些泛型相关的辅助方法,如类型转换、泛型安全的数组创建等,这些在处理泛型时非常有用。 7. **数学计算工具类**:如MathUtil,可能包含各种数学运算,如取模、平方根...

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

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

    c#使用 和 继承 泛型类

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

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

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

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

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

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

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

    实例188 -泛型化接口与最大值

    在Java编程语言中,泛型(Generics)是自Java 5版本引入的一项重要特性,它允许我们在类、接口和方法中使用类型参数,从而提高了代码的可...在实际项目中,这样的泛型工具类可以极大地提升代码的可维护性和可扩展性。

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

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

    Java开发工具代码库

    8. **泛型工具类**: - `GenericsUtils`:处理泛型相关的操作,如类型判断、类型转换、创建泛型实例等。 这些工具类的使用能够极大地提升开发效率,减少出错概率,让开发者更专注于业务逻辑而不是基础操作。在实际...

    实例185 - 自定义泛型化数组类

    这个实例185可能是进一步讨论泛型数组类如何应用于实际项目,例如作为缓存、队列或其他数据结构的基础,或者作为工具类帮助处理不同类型的数据集。标签中的"源码"表明可能有具体的代码实现供学习,而"工具"可能意味...

    java-Generic-tools.rar_stringtools java

    包含获得各种集合对象的常用方法的泛型工具类。如果要获得一个 {@code Map&lt;String, String&gt;} 的对象,可以通过下面的方式实现: * {@literal Map&lt;String, String&gt; map = GenericUtils.getMap() }。但是...

    TypeScript泛型类 - 把类作为参数类型的泛型类.zip

    在这个“TypeScript泛型类 - 把类作为参数类型的泛型类”示例中,我们将深入探讨如何利用泛型在TypeScript中创建灵活的、可复用的类模板。 泛型是TypeScript中的一个核心概念,它允许我们在编写代码时定义和重用...

    TypeScript中的泛型 泛型变量 泛型类.zip

    在TypeScript中,泛型是一种强大的工具,它允许我们在编写代码时定义可重用的数据类型模板,从而提高代码的灵活性和可复用性。泛型是TypeScript的一大特色,它在许多面向对象的设计模式和数据结构中发挥着关键作用。...

    实现泛型类集合 实现双向链表

    在Java等面向对象的语言中,泛型是一种强大的工具,它允许我们在集合类中使用多种类型的元素,同时保持类型安全。本话题将探讨如何实现一个泛型类集合,特别是实现一个双向链表,并提供相关的方法,如求表长度。 ...

    泛型java的泛型知识,非常有用

    Java 泛型是一种强大的语言特性,自JDK 5.0引入以来,极大地提升了代码的类型安全性以及重用性。泛型允许我们在类、接口和方法中使用类型参数,这样在编译...在设计复杂的数据结构或容器类时,泛型是必不可少的工具。

Global site tag (gtag.js) - Google Analytics