T.getClass()或者T.class都是非法的,因为T是泛型变量。
由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。
/**
*@author Joshua
*@version 2011-12-15 下午02:27:43
*/
/**
* 可以在service层直接调用,也可以在DAO层扩展调用
*/
public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK>{
private Class<T> persistentClass;
/**
* 用于Dao层子类使用的构造函数. 通过子类的泛型定义取得对象类型
*/
@SuppressWarnings("unchecked")
public BaseDaoImpl(){
//getClass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
this.persistentClass=(Class<T>)getSuperClassGenricType(getClass(), 0);
}
...
/**
* 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
*
*@param clazz
* clazz The class to introspect
* @param index
* the Index of the generic ddeclaration,start from 0.
* @return the index generic declaration, or Object.class if cannot be
* determined
*/
@SuppressWarnings("unchecked")
public static Class<Object> getSuperClassGenricType(final Class clazz, final int index) {
//返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
//返回表示此类型实际类型参数的 Type 对象的数组。
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
return Object.class;
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
分享到:
相关推荐
Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...
介绍获取方法的参数和返回值类型(包括Type和Class)获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)方法首先我们定义一个类:public cla
4. **利用`Class<T>`作为泛型约束**:有时候,我们可以在泛型类中使用`Class<T>`作为参数或字段,这样可以在运行时获取类型信息。例如: ```java public class MyClass<T> { private final Class<T> clazz; ...
使用继承方式获取泛型的类型实例是指在子类中获取父类的泛型类型实例,例如,我们可以定义一个抽象类 `JdbcDaoSupport<T>`,然后在子类 `UserDao` 中继承这个抽象类,并获取泛型类型实例。 ```java public abstract...
例如,我们可以使用 `Class<T>.getGenericSuperclass()` 或 `Class<T>.getGenericInterfaces()` 来获取类的父类或接口的泛型信息。这些方法返回的是 `Type` 接口的实现,如 `ParameterizedType`,`WildcardType` 等...
例如,我们可以定义一个泛型接口`IGenericCollection<T>`,要求实现它的类必须提供添加、删除和获取元素的方法: ```csharp public interface IGenericCollection<T> { void Add(T item); void Remove(T item); ...
Spring 中优雅的获取泛型信息的方法 在 Spring 框架中,获取泛型信息是非常重要的,在实际开发中经常会遇到这种情况。今天,我们来讨论如何在 Spring 中优雅地获取泛型信息。 第一种方法:通过反射获取泛型信息 ...
- 反射API在泛型类型擦除后仍然能获取到泛型信息,这主要通过泛型类的类型参数的实际类型参数化实例(TypeToken)来实现。 - 这使得在运行时可以进行一些泛型相关的操作,如创建参数化的类实例。 总结来说,Java...
本资源"**C#常用泛型类型.rar**"提供了关于C#中两种最常见的泛型类型——`Dictionary<TKey, TValue>`和`List<T>`的实例代码,这对初学者来说是极好的学习资料。下面将详细讲解这两个泛型容器以及它们在实际开发中的...
在Java中,泛型通常以尖括号 `<T>` 表示,其中 `T` 是类型参数,可以代表任何引用类型。 - 类如 `class Java_Generics,V>`,`K` 和 `V` 就是类型参数,类似于函数中的变量,它们在实例化时会被具体的类型替换。 - ...
在C#编程中,泛型列表`List<T>`是一个非常重要的数据结构,它为我们提供了动态数组的功能,并且具有类型安全的特性。这篇文章将深入探讨`List<T>`的使用,包括其基本操作、性能特点以及一些高级用法。 一、基础概念...
例如,如果我们有一个子类继承自DAO<T>,我们可以通过以下方式获取T的类型: ```java Class<?> clazz = 子类.class; Type genericSuperclass = clazz.getGenericSuperclass(); if (genericSuperclass instanceof ...
- 如果需要,可以在运行时通过强制类型转换获取原始类型,但这样会丢失泛型带来的类型安全性。 8. 泛型和实例化: - 泛型类的实例化必须提供实际类型参数,如`MyList<String> list = new MyList();` - 对于无参...
在给定的代码片段中,`SetListValue<T>` 方法是一个泛型方法,其中 `T` 是类型参数。这意呀着该方法可以接受任何类型的对象列表,并且能够根据不同类型的对象执行相同的操作,同时保持类型安全性。 ### 反射...
10. **泛型与反射**:通过反射,我们可以动态地创建泛型类型实例,获取和设置泛型类型字段,调用泛型方法等。这对于构建元编程和动态代码生成的场景非常有用。 总的来说,C#泛型的应用实例非常广泛,从简单的数据...
- 类型参数(Type Parameter):在创建泛型类或泛型方法时使用的占位符,例如 `<T>`、`<E>` 等。 - 类型参数边界(Type Bounds):可以限制类型参数的类型,如 `class Box<T extends Number>` 指定 `T` 必须是 `...
使用 `Class` 字面量可以在运行时获取类型的元数据信息。这对于实现泛型方法时非常有用,特别是在需要确定某个类型的实例是否符合某种类型条件时: ```java public static <T> boolean isInstanceOf(Class<T> clazz,...
在C#中,我们使用尖括号`<>`来定义泛型,如`List<T>`,其中`T`是类型参数,代表一个未指定的具体类型。 在控件编程中,我们可能会创建一个泛型容器类,它可以接受任何类型的对象,如`public class MyGenericControl...