通过反射获取父类中的泛型参数对应的Class对象
2016-05-06 10:44
267 查看
假设有两个类:Dao 和 PersonDao,它们的代码如下:Dao:
public class Dao<T> { private Class<T> clazz; T getId(Integer id){ return null; } void save(T entity){ } }PersonDao:
public class PersonDao extends Dao<Person> { }Person:
public class Person { private String name; private String street; public void setName(String name) { this.name = name; } public void setStreet(String street) { this.street = street; } public String getName() { return name; } public String getStreet() { return street; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", street='" + street + '\'' + '}'; } }
ReflectionUtil:
/** * 通过反射获得定义Class时声明的父类的泛型参数的类型 * 例如:public EmployeeDao extends BaseDao<Employee,String> * @param clazz: 子类对应的Class对象 * @param index: 泛型参数列表对应的位置,从0开始 */ public class ReflectionUtil { public static Class getSuperClassGenericType(Class clazz,int index){ // Type type= clazz.getGenericSuperclass(); // if(type instanceof ParameterizedType){ // ParameterizedType parameterizedType = (ParameterizedType) type; // Type[] args = parameterizedType.getActualTypeArguments(); // if(args !=null && args.length>0){ // Type arg = args[0]; // if(arg instanceof Class){ // return (Class)arg; // } // } // // } // return null;
//getSuperclass()获得该类的父类 //getGenericSuperclass()获得带有泛型的父类 //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
Type genType= clazz.getGenericSuperclass();//获取带泛型参数的父类 if(!(genType instanceof ParameterizedType)){ return Object.class; } Type[] param = ((ParameterizedType) genType).getActualTypeArguments();//获取真实泛型参数 if(index >= param.length || index < 0){ return Object.class; } if(!(param[index] instanceof Class)){ return Object.class; } return (Class) param[index]; } @Test public void getSuperClassGenericTypeTest(){ PersonDao personDao = new PersonDao(); Class clazz = ReflectionUtil.getSuperClassGenericType(personDao.getClass(),0); System.out.println(clazz); } }通过ReflectionUtil中的静态方法getSuperClassGenericType()获取父类中泛型参数对应的Class对象后,调用newInstance可以创建对应的实例,Dao中的getId方法就可以返回泛型参数对应的实例。
相关文章推荐
- Asp.net磁力链接搜索引擎源码-www.btboot.com
- EVE ToDo
- 使用DBOutputFormat把MapReduce产生的结果集导入到mysql中
- C++第五次实验作业——项目一
- 设计模式的解析和实现(C++)之二十一-完结篇
- 非标准武术擂台1V1机器人示例程序
- centos6.3下安装中文输入法
- Android ListView滑动会触发addTextChangedListener
- ios 安全相关工具整理
- Power of Four
- [一起学Hive]之十七-从Hive表中进行数据抽样-Sampling
- 利用 Ngrok 穿透内网访问树莓派
- 辛普森公式
- C++第五次作业
- 软件工程中的各种耦合类型
- 腾讯深度学习系列——深度学习及并行化实现概述
- Lifeary 6.2 Select 标签
- spark源码阅读笔记RDD(七) RDD的创建、读取和保存
- 【Json】关于json解析时异常org.json.JSONException: A JSONObject text must begin with '{' at character 1 of {的解决方法
- tableview