java通过反射获得泛型参数(this.getClass().getGenericSuperclass())

    xiaoxiao2023-10-31  174

    需求分析

    项目中想抽去持久层的代码,抽取一个通用的BaseDao ,但其中的 T 泛型参数无法获得,于是利用反射实现,具体实现看后面的代码。

    代码实现

    通用Dao (BaseDao)

    public class BaseDao<T> { //代表的是某个实体的类型 private Class<T> entityClass; public BaseDao() { //getClass()获得一个实例的类型类;相当于 某类.class eg:UserDao.class Class class1 = getClass(); System.out.println(class1); //getSuperclass()获得该类的父类 Class superclass = class1.getSuperclass(); System.out.println(superclass); //getGenericSuperclass()获得带有泛型的父类 //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型 Type type = class1.getGenericSuperclass(); System.out.println(type); //ParameterizedType参数化类型,即泛型 ParameterizedType p=(ParameterizedType)type; //getActualTypeArguments获取参数化类型的数组,泛型可能有多个 entityClass=(Class<T>) p.getActualTypeArguments()[0]; System.out.println(entityClass); }

    结果: class ClassDemo.UserDao class ClassDemo.BaseDao ClassDemo.BaseDao<ClassDemo.Persion> class ClassDemo.Persion

    通用Dao子类(UserDao)

    package ClassDemo; public class UserDao extends BaseDao<Persion> { }

    某实体类 (Persion)

    package ClassDemo; public class Persion { private String name; private Integer id; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }

    主程序Test类

    package ClassDemo; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub UserDao userDao = new UserDao(); } }

    扩展

    在获得类型类之后,你就可以调用其中的一些方法获得类型的信息了,主要的方法有:

    getName():String:获得该类型的全称名称。 getSuperClass():Class:获得该类型的直接父类,如果该类型没有直接父类,那么返回null。 getInterfaces():Class[]:获得该类型实现的所有接口。 isArray():boolean:判断该类型是否是数组。 isEnum():boolean:判断该类型是否是枚举类型。 isInterface():boolean:判断该类型是否是接口。 isPrimitive():boolean:判断该类型是否是基本类型,即是否是int,boolean,double等等。 isAssignableFrom(Class cls):boolean:判断这个类型是否是类型cls的父(祖先)类或父(祖先)接口。 getComponentType():Class:如果该类型是一个数组,那么返回该数组的组件类型。 此外还可以进行类型转换这类的操作,主要方法有: asSubclass(Class clazz):Class:将这个类型 心有猛虎,细嗅蔷薇。。。
    最新回复(0)