/**
* 通过反射,获得指定类的父类的泛型参数的实际类型. 如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];
}
分享到:
相关推荐
通过反射获得指定类的父类的泛型参数的实际类型
- 泛型方法的类型参数可以与类的泛型参数相同,但互不影响。 #### 四、类型通配符 类型通配符允许我们编写更灵活的代码。常见的类型通配符包括: - **无界通配符**:`<?>`,表示任何类型。 - **上界通配符**:`...
Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析。 一、泛型的基本概念 泛型是Java 5中...
泛型编程是Java、C#等面向对象编程语言中的一项重要特性,它允许在定义类、接口和方法时使用类型参数,从而实现代码的复用并提供编译时的类型安全检查。本教程将以Java中的List接口为例,深入探讨泛型编程的概念、...
- 泛型类实例化:创建泛型类的实例时,需要指定类型参数的实际类型,如`TestGen, Integer> t = new TestGen, Integer>();` 2. **泛型通配符** - 无界通配符:`?`表示任何类型,但无法在方法内部进行添加操作,...
- 泛型方法可以在类的任何地方定义,与类的泛型参数无关,如`public <T> void printList(List<T> list) {...}`,`printList()`方法接受任何类型的列表。 4. **通配符(Wildcard)** - 用于表示对类型参数的限制,...
- 当子类继承泛型父类时,可以指定不同的类型参数,实现多态性。 - 也可以使用类型参数`<?>`来表示父类的泛型类型不确定,这样在子类中可以操作父类的方法,但不能访问具体的泛型类型信息。 7. **野指针警告** -...
由于类型擦除,泛型类不能覆盖或实现具有相同类型参数的非泛型方法。例如,`List<String>`不能覆盖`List<Object>`的方法,因为它们在运行时被视为相同的类型。 10. 泛型和序列化 泛型类默认是不可序列化的,除非...
- **泛型类**:泛型类是在类定义时引入类型参数的,如`Box<T>`中的`T`,它代表一个未指定的具体类型。这种设计使得类能够处理不同类型的对象,而不必为每种类型创建单独的类。例如,`Box<Integer>`、`Box<Double>`...
泛型允许我们在定义类、接口和方法时指定一种或多种类型,这种类型可以是任何引用类型,包括基本类型的包装类。使用泛型的主要目标是限制对象的类型,确保在编译时就能检测到可能的类型错误,而不是在运行时抛出异常...
例如,一个通用的交换两个元素的方法可以声明为`public static <T> void swap(T[] arr, int i, int j)`,这里的T是方法的泛型参数,允许传入任何类型的数组。 4. **泛型通配符**: 在处理多种类型但又不想为每种...
在定义泛型类或接口时,声明的类型参数被称为形式类型参数(Formal Type Parameter),而在创建实例或调用方法时使用的具体类型则称为实际类型参数(Actual Type Parameter)。如上例中的`T`是形式类型参数,而`...
通过`Type`接口及其子接口,如`ParameterizedType`和`GenericArrayType`,可以获取到泛型的实际类型参数。 7. 在Hibernate中的应用 Hibernate是一个流行的Java ORM(对象关系映射)框架,反射机制在其中发挥了关键...
- **边界**:通过`extends`或`super`关键字设定类型参数的上下界,如`List<? extends Number>`只允许添加Number或其子类,`List<? super Integer>`则可以添加Integer或其父类。 - **类型擦除**:Java泛型在编译后...
6. **泛型处理**:虽然反射不能直接处理泛型类型信息,但可以通过获取类的实际类型参数来间接实现,例如`TypeVariable`和`ParameterizedType`接口。 7. **注解处理**:反射也支持检查类、方法、字段上的注解,通过`...
泛型允许程序员在定义类、接口和方法时,指定一个或多个类型参数,这些参数在实际使用时会被具体的类型替换。这样做不仅增强了编译时的检查,减少了类型转换的需要,还避免了运行时可能出现的ClassCastException。 ...
虽然Java反射不能直接获取到泛型的实际类型,但是可以通过方法签名或者字段类型获取到擦除后的边界类型。 6. **接口与实现类**: 反射也可以用来检查一个类是否实现了特定的接口,通过`Class.getInterfaces()`...
5. **泛型处理**:虽然Java反射不能直接处理泛型信息,但可以通过获取参数类型的原始类型来间接处理。例如,`ParameterizedType parameterType = (ParameterizedType) method.getGenericReturnType();`可以获取到...
泛型允许程序员在定义类、接口和方法时指定类型参数,使得在编译时期就能检查类型错误,而不再需要在运行时进行强制类型转换,从而减少了潜在的ClassCastException。 1. **泛型的基本概念** - 类型参数:在类、...
5. **遍历类层次**:通过`getSuperclass()`方法可以获取类的父类,`getInterfaces()`方法获取实现的接口,这有助于构建类的继承关系图。 6. **泛型处理**:虽然Java的反射不直接支持泛型,但可以通过`...