用的时候不好找,今天看nutz的dao的源码看到了,摘出来备份
public static Type[] getTypeParams(Class<?> klass) {
if (klass == null || "java.lang.Object".equals(klass.getName()))
return null;
// 看看父类
Type superclass = klass.getGenericSuperclass();
if (null != superclass && superclass instanceof ParameterizedType)
return ((ParameterizedType) superclass).getActualTypeArguments();
// 看看接口
Type[] interfaces = klass.getGenericInterfaces();
for (Type inf : interfaces) {
if (inf instanceof ParameterizedType) {
return ((ParameterizedType) inf).getActualTypeArguments();
}
}
return getTypeParams(klass.getSuperclass());
}
只能查找有父类或者实现了接口的类,否则返回null.
ps:看来基础api还有很多不懂啊.
分享到:
相关推荐
通过反射获得指定类的父类的泛型参数的实际类型
例如,有一个泛型基类`Foo<T>`,其子类`FooChild`传入了一个具体的泛型参数`Bar`,要获取这个参数类型,通常有两种常见做法: a. 在基类中定义一个构造函数,传入泛型类型`T`的`Class`对象,这样子类实例化时可以...
当我们声明了一个泛型的接口或类,或需要一个子类继承至这个泛型类,而我们又希望利用反射获取这些泛型参数信息。这是本文将要介绍的ReflectionUtil是为了解决这类问题的辅助工具类,为java.lang.reflect标准库的...
在本主题中,我们将深入探讨如何通过反射获取泛型参数,并利用这些信息创建对象。 首先,让我们了解什么是反射。反射是Java提供的一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息。通过反射,...
1. **方法参数**:当一个方法需要接受一个基类类型的参数时,你可以传入任何子类的对象,这允许方法对不同类型的对象进行统一处理。 2. **集合操作**:在泛型集合如`List<BaseClass>`中,可以存储任何子类的对象,...
在上面的代码中,我们使用 `getClass().getGenericSuperclass()` 方法获取当前类的父类,然后使用 `ParameterizedType` 对象获取泛型类型参数。最后,我们使用 `clazz.newInstance()` 方法实例化泛型对象。 完整...
- 泛型方法可以在类的任何地方定义,与类的泛型参数无关,如`public <T> void printList(List<T> list) {...}`,`printList()`方法接受任何类型的列表。 4. **通配符(Wildcard)** - 用于表示对类型参数的限制,...
在Java编程语言中,继承是...总之,Java中的继承是非泛型类和泛型类共有的特性,允许子类获取并扩展父类的功能。在实际编程中,理解如何正确地继承和使用非泛型类是至关重要的,这有助于构建灵活且易于维护的代码结构。
当基类是泛型时,子类也可以继承这些泛型参数。在继承泛型类时,子类可以选择约束类型参数,或者提供具体的类型。以下是一个示例: ```csharp public class DerivedGenericClass<T> : MyGenericClass { public ...
- 也可以使用类型参数`<?>`来表示父类的泛型类型不确定,这样在子类中可以操作父类的方法,但不能访问具体的泛型类型信息。 7. **野指针警告** - 在未使用泛型的旧代码中,可能会出现“可能的不匹配类型”警告。...
这意味着在运行时,我们无法通过反射或其他方式获取到泛型信息,但编译时的类型检查仍然有效。 总之,“泛型实现小例”主要涉及Java编程中的泛型使用,包括在类、接口和方法中定义类型参数,以及如何通过泛型提高...
- 泛型方法的类型参数可以与类的泛型参数相同,但互不影响。 #### 四、类型通配符 类型通配符允许我们编写更灵活的代码。常见的类型通配符包括: - **无界通配符**:`<?>`,表示任何类型。 - **上界通配符**:`...
- **Bean容器**:Spring的ApplicationContext接口提供了泛型版本的getBean方法,如`ApplicationContext.getBean(Class<T> requiredType)`,这样可以确保在获取Bean时的类型安全。 - **AOP代理**:Spring支持基于...
- 如果需要在运行时获取泛型信息,可以使用 `getGenericSuperclass()` 或 `getGenericInterfaces()` 等方法,但通常需谨慎处理。 总的来说,Java泛型为开发者提供了更高级别的抽象,提高了代码的清晰度、类型安全...
虽然反射可以访问非泛型类型的信息,但无法直接获取到泛型的类型参数。这限制了在运行时对泛型的某些操作,比如创建具有特定类型参数的泛型对象。 8. **泛型与多态** 泛型可以与多态结合,允许子类继承父类的泛型...
10. **反射和泛型**:虽然泛型信息在运行时被擦除,但通过反射可以获取到泛型的原始类型信息,这对于编写一些高级的库和工具非常有用。 通过理解和熟练运用这些知识点,开发者可以编写出更加健壮、可读性更强的Java...
Java泛型在编译后会进行类型擦除,这意味着运行时无法获取到泛型的具体类型信息。所有的泛型类型在运行时都会被替换为其边界或Object。这解释了为什么我们不能在运行时通过反射检查一个对象是否属于某个泛型类型。 ...
例如,一个通用的交换两个元素的方法可以声明为`public static <T> void swap(T[] arr, int i, int j)`,这里的T是方法的泛型参数,允许传入任何类型的数组。 4. **泛型通配符**: 在处理多种类型但又不想为每种...
2. 泛型约束:可以为类型参数设定边界,如`class Box<T extends Number>`,限制`T`只能是Number或其子类。 3. 泛型方法:在方法定义中也可以使用泛型,如`public <T> void print(T item)`,`T`是方法级别的类型参数...
- `extends` 关键字在泛型中的作用是限定类型参数的范围,如 `List<T extends Number>` 表示 `T` 必须是 `Number` 或其子类。 4. **泛型与数据类型转换** - 泛型的主要优点之一是消除显式类型转换的需求。在泛型...