如有以下类:
父类:
public class Person<T> { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
子类:
public class Student extends Person<Student> { private String num; public String getNum() { return num; } public void setNum(String num) { this.num = num; }; }
通过反射获取父类泛型的类型方法:
Class <T> entityClass = (Class <T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
详细获取方式:
@Test @SuppressWarnings("rawtypes") public void testGetSuper(){ Student student = new Student(); Class clazz = student.getClass(); //获取该类的父类 System.out.println("该类的父类:"+clazz.getSuperclass()); //获得带有泛型的父类 Type type = clazz.getGenericSuperclass(); System.out.println("带泛型的父类:"+type); // 获取参数化类型(即泛型) ParameterizedType p = (ParameterizedType) type; //泛型可能是多个,获取自己需要的 Class clazz2 = (Class) p.getActualTypeArguments()[0]; System.out.println("父类泛型的类型:"+clazz2); }
输出结果为:
该类的父类:class com.test.bean.Person
带泛型的父类:com.test.bean.Person<com.test.bean.Student>
父类泛型的类型:class com.test.bean.Student
相关推荐
本教程聚焦于通过反射获取运行时类的父类以及父类中的泛型信息。这是一项高级技能,对理解和调试复杂的Java应用程序尤其有用。 首先,我们来理解什么是反射。在Java中,类、接口和方法等都是由类对象表示的,这些类...
- 反射API在泛型类型擦除后仍然能获取到泛型信息,这主要通过泛型类的类型参数的实际类型参数化实例(TypeToken)来实现。 - 这使得在运行时可以进行一些泛型相关的操作,如创建参数化的类实例。 总结来说,Java...
在基类中定义一个构造函数,传入泛型类型`T`的`Class`对象,这样子类实例化时可以明确传入: ```java public abstract class Foo<T> { private Class<T> tClass; public Foo(Class<T> tClass) { this.tClass =...
源码文件 `<反射(2):泛型相关周边信息获取>` 可能包含示例代码,演示了如何通过反射获取和操作泛型类和接口的实例。通过阅读和学习这段代码,开发者可以更深入地理解反射和泛型的交互,提升在实际项目中的应用...
使用继承方式获取泛型的类型实例是指在子类中获取父类的泛型类型实例,例如,我们可以定义一个抽象类 `JdbcDaoSupport<T>`,然后在子类 `UserDao` 中继承这个抽象类,并获取泛型类型实例。 ```java public abstract...
该类提供了一系列用于处理泛型的方法,包括获取父类泛型类型、获取方法返回类型的泛型等。 ```java public class GenericsUtils { // ... } ``` ##### 2. 获取父类泛型类型 ```java public static Class<?> ...
2. 泛型 + 反射:泛型可以与反射结合使用,通过反射的API来获取T的Class。 3. 收敛:泛型可以增加类型安全,减少了强制类型转换的代码。 4. MetaProgramming:泛型可以在编译期搞很多东西,比如MetaProgramming。 ...
通过反射获得指定类的父类的泛型参数的实际类型
Java编程语言中的反射和泛型是两个非常重要的概念,它们为开发者提供了强大的工具来操作类、接口、对象以及参数类型。在"myreflect.rar"这个压缩包中,我们可以期待找到一系列关于这两个主题的源代码示例,这将有助...
第一种方法:通过反射获取泛型信息 在 Spring 中,我们可以通过反射来获取泛型信息。我们可以使用 Java 的反射机制来获取 Class 对象中的泛型信息。下面是一个示例代码: ```java public static Class<?> ...
虽然反射可以访问非泛型类型的信息,但无法直接获取到泛型的类型参数。这限制了在运行时对泛型的某些操作,比如创建具有特定类型参数的泛型对象。 8. **泛型与多态** 泛型可以与多态结合,允许子类继承父类的泛型...
- 也可以使用类型参数`<?>`来表示父类的泛型类型不确定,这样在子类中可以操作父类的方法,但不能访问具体的泛型类型信息。 7. **野指针警告** - 在未使用泛型的旧代码中,可能会出现“可能的不匹配类型”警告。...
这解释了为什么我们不能在运行时通过反射检查一个对象是否属于某个泛型类型。 4. 泛型方法 泛型方法是在方法级别声明的,它们有自己的类型参数,可以独立于所在类的类型参数。例如,`Collections.sort()` 方法就是...
- 当子类也是泛型类时,子类和父类的泛型类型必须保持一致: ```java class ChildGeneric<T> extends Generic<T> {} ``` - 当子类不是泛型类时,父类必须明确泛型的数据类型: ```java class ChildGeneric ...
泛型也可以用于类的继承,子类可以继承父类的泛型类型,或者重新定义自己的类型参数。 最后,我们讨论一下泛型与多态的关系。泛型提供了一种新的多态形式,即类型参数多态。它允许我们在一个方法或类中处理多种类型...
- Java泛型在编译后会进行类型擦除,这意味着在运行时,所有的泛型类型信息都会被替换为它们的边界类型或`Object`。因此,泛型并不改变对象的实际类型,仅在编译时提供类型检查。 6. **泛型与集合** - Java集合...
Class Literals as Run-time Type Tokens 是一种利用类字面量(Class literals)作为运行时类型标识符的技术,常用于反射中获取泛型类型信息。 通配符匹配(wildcard capture)是指编译器会为每个通配符创建一个...
- **泛型与反射的结合**:由于类型擦除,反射无法直接获取到泛型的类型信息。然而,可以通过泛型类的原始类型(如`List`而非`List<String>`)以及类的注解来间接获取一些信息。 通过深入理解Java泛型,开发者可以...
然而,通过反射或构造旧版本API的方式,仍然可能存在创建“野指针”(即不匹配类型的引用)的风险,这被称为类型擦除的副作用。 9. 有限的多态性 由于类型擦除,泛型类不能覆盖或实现具有相同类型参数的非泛型方法...
- 反射中,虽然运行时无法获取泛型信息,但可以通过类的`getGenericSuperclass()`和`getGenericInterfaces()`方法获取到带有类型参数的类和接口信息。 10. **泛型与集合框架** - Java集合框架全面采用了泛型,如...