需求分析
项目中想抽去持久层的代码,抽取一个通用的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:将这个类型
心有猛虎,细嗅蔷薇。。。 |