`
sunting_bcwl
  • 浏览: 95968 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java反射获取泛型工具类

阅读更多
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 {
/**
* 通过反射,获得指定类的父类的泛型参数的实际类型. 如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);
}
}


注:获取Class<?>实例后,如果要得到 T 实例,直接T t = (T)c.newInstance()即可得到
分享到:
评论
5 楼 jiashie 2013-04-26  
class A{
B<User> b= new B<User>();
}
class B <T>{
  ArrayList<T> items = new ArrayList<T> items;
}
class User{
}
怎么用反射获取A中的field B的类型时是错误的啊,是ImplForType类型,而不是User?
元素类型


4 楼 yeelor 2012-03-17  
0704681032 写道


你妹的,感觉像是 借鉴了 巴巴运动网啊。。。

就是巴巴的原代码
3 楼 zx848 2012-02-27  
可以把代码写得很简单以至于明显找不到缺陷;也可以把它写得很复杂以至于找不到明显的缺陷。 - C.A.R. Hoare
2 楼 smith789 2012-01-11  
1 楼 0704681032 2011-08-16  


你妹的,感觉像是 借鉴了 巴巴运动网啊。。。

相关推荐

    java反射与泛型综合例子

    Java反射是Java语言提供的一种能力,允许运行中的程序动态地获取类的信息(如类名、方法名、参数类型等)并调用这些方法。反射机制的核心类包括`Class`、`Constructor`、`Method`和`Field`,它们分别代表类、构造器...

    Java-Java反射与泛型教程

    Java反射与泛型是Java编程中的两个重要特性,它们各自为开发者提供了强大的工具来增强代码的灵活性和类型安全性。在本教程中,我们将深入探讨这两个主题,帮助你更好地理解和运用它们。 **Java反射** Java反射机制...

    泛型工具类

    在Java中,泛型工具类的构建对于实现通用功能、提高代码复用性和降低维护成本具有重要意义。 #### 核心知识点解析:泛型工具类 标题提到的“泛型工具类”主要指的是一种设计模式或编程实践,它提供了一系列用于...

    java 基于泛型与反射的通用 DAO

    反射是Java提供的一个强大的工具,允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作。在实现通用DAO时,反射通常用于动态调用数据库操作的方法,比如SQL查询。例如,在`UsersDAO.java`中,...

    Java反射、泛型和注解实战之Spring核心注入IOC的实现

    通过这个实战项目,你可以深入理解Java反射、泛型和注解的用法,并且了解到如何利用它们构建一个基本的依赖注入系统,这将有助于你更好地理解和使用Spring框架。同时,这样的实践也有助于提升你的编程技能,使你能够...

    Java泛型的用法及T.class的获取过程解析

    * 工具类:泛型可以用于工具类中,例如工具类的静态方法可以使用泛型。 五、结论 泛型是Java编程语言中的一种重要特性,它可以提高代码的灵活性和可读性。通过使用泛型,我们可以编写更加灵活和可维护的代码。此外...

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...

    654.652.JAVA基础教程_反射-获取运行时类的父类及父类的泛型(654).rar

    本教程聚焦于通过反射获取运行时类的父类以及父类中的泛型信息。这是一项高级技能,对理解和调试复杂的Java应用程序尤其有用。 首先,我们来理解什么是反射。在Java中,类、接口和方法等都是由类对象表示的,这些类...

    反射处理java泛型

    这是本文将要介绍的ReflectionUtil是为了解决这类问题的辅助工具类,为java.lang.reflect标准库的工具类。它提供了便捷的访问泛型对象类型(java.reflect.Type)的反射方法。  本文假设你已经了解java反射知识,并能...

    JAVA5泛型和反射

    反射是 Java 提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、字段、方法等),并能动态创建对象、调用方法。这为实现动态代理、元编程等高级功能提供了可能。例如,使用 `Class` 对象可以...

    java反射工具类

    java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符串方式输出。只是个工具类,没有写测试类,...

    java 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被...

    myreflect.rar 反射和泛型使用源码

    总的来说,Java反射提供了运行时的动态能力,而泛型则在编译时提高了类型安全性。结合使用,开发者可以构建更加灵活且安全的系统。通过学习和实践压缩包中的源代码,你将能够更熟练地运用这两个工具解决实际问题。

    java反射全解(反射原理+反射API详解+反射与数组+反射与泛型+反射源码与性能开销+反射优缺点+反射与内省)

    泛型是 Java 语言中的一种类型参数机制,反射机制可以动态地获取泛型的信息和调用泛型的方法。 反射源码与性能开销是指在反射机制中如何影响性能。反射机制可以动态地获取类的信息和调用对象的方法,但是它也存在...

    反射与泛型

    反射是Java提供的一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息。通过反射,我们可以动态地创建对象、调用方法、访问和修改字段,甚至执行构造函数。这为程序提供了极大的灵活性和动态性。 ...

    java反射机制工具类

    `BeanHelper.java`可能是一个工具类,用于简化对Java Bean的操作,特别是通过反射来设置属性值和获取属性。这类工具通常包含以下功能: 1. `setPropertyValue`: 这个方法接受对象、属性名和属性值,然后使用反射...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    反射泛型

    **反射** 是Java提供的一种强大的工具,允许我们在运行时检查和操作类、接口、字段和方法的信息。通过使用反射,我们可以在运行时动态地创建对象、调用方法、访问和修改字段,甚至可以执行私有成员的操作。反射主要...

    泛型 反射 相关概念方法使用

    Java.lang.Class类是反射的核心,通过对象的Class对象,我们可以获取到类的各种信息,如构造器、方法和字段。java.lang.reflect包提供了Constructor、Method和Field类,分别代表了类的构造器、方法和字段,可以用来...

Global site tag (gtag.js) - Google Analytics