通过反射获取父类中的泛型参数对应的Class对象
假设有两个类: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方法就可以返回泛型参数对应的实例。
通过反射获取父类中的泛型参数对应的Class对象的更多相关文章
- SSH整合中,使用父action重构子类action类.(在父类中获取子类中的泛型对象)
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import com.opensymphony.x ...
- 编写高质量代码改善C#程序的157个建议——建议43:让接口中的泛型参数支持协变
建议43:让接口中的泛型参数支持协变 除了上一建议中提到的使用泛型参数兼容接口不可变性外,还有一种办法是为接口中的泛型声明加上out关键字来支持协变,如下所示: interface ISalary&l ...
- 获取request中的查询参数
//获取request中的查询参数 public static Map<String, Object> getRequestParamsByMap(HttpServletRequest r ...
- 获取url中查询字符串参数
// 获取url中查询字符串参数 例如http://www.test.com?a=1&b=2 function RequestParamete() { var url = window.loc ...
- springboot的restful风格获取请求中携带的参数
http://localhost:8080/emp/1 有以上请求,我们controller要怎么获取请求中传递的参数1呢? 通过PathVariable注解,如下: @DeleteMapping(& ...
- 通过反射获取父类泛型的Class对象 ParameterizedType
((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0] 这个方法这么用啊,返回什么,请给 ...
- C#通过反射获取类中的方法和参数个数,反射调用方法带参数
using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...
- JS获取Url中传入的参数
一:后台获取,前台调用 后台: object value= Request.QueryString[key]; 前台js: $(function(){ var value="<%=va ...
- jQuery获取地址栏中的链接参数
http://caibaojian.com/177.html 问题描述 今天做一个主题,有一个需求是根据不同的页面来做,虽然php也可以做到,不过考虑到自己的特效代码都是在jQuery上完成,想着能否 ...
随机推荐
- 初试体验java多线程
现在个人电脑以及服务器都是多核cpu,如何提高多核cpu的利用率,就要用到多线程技术了. public class TestThread1 { ; static class PThread exten ...
- httpClenit的post出现乱码问题
在使用httpClient.executeMethod(postMethod)的时候,发现一直存在乱码问题,”book is good“被转成”book+is+good“ 返回.查看源码后,发现pos ...
- shell随机写入指定文件
具体思路如下,求代码 shell随机读取file.txt文本,file.txt文本有许多行文字 想用shell随机读取file.txt的任意一行文字并且写入到file.php第四行文件. sed -i ...
- eclipse新建web项目,运行后在tomcat安装目录下webapps中没有该项目
一.发现问题在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并没 ...
- Oracle自增主键的添加[sequence]--表数据已存在
--增加主键ID ); --设置sequence使ID自增 create sequence SEQ_ID minvalue maxvalue start ; --将id的值设置为sequence Up ...
- SIlverlight外包公司【技术展望】— Silverlight5.1.2最新版本发布,Silverlight 的更新从未停止。
微软发布新版Silverlight 5, 版本号5.1.20913.0 大家可以到微软网站去下载最新版本网址是 http://www.microsoft.com/getsilverlight/get- ...
- 【SVN】win7 搭建SVN服务器
介绍 SVN分为客户端和服务端: 服务端: 常用的主要有2个,分别为: 1. VisualSvn Server:免费,集成了Subsersion和Apache,安装使用非常简单: 2. SubVers ...
- Python 字典的创建赋值和动态扩展
>>> cleese={} >>> palin=dict() >>> type(cleese) <class 'dict'> > ...
- android学习笔记28——Activity生命周期
Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非 ...
- 批量修改Sqlserver中数据库对象的所属架构
执行以下SQL,将执行结果拷贝出来,批量执行既可. SELECT 'ALTER SCHEMA dbo TRANSFER ' + s.Name + '.' + p.Name FROM sys.Proce ...