假设有两个类: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对象的更多相关文章

  1. SSH整合中,使用父action重构子类action类.(在父类中获取子类中的泛型对象)

    import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import com.opensymphony.x ...

  2. 编写高质量代码改善C#程序的157个建议——建议43:让接口中的泛型参数支持协变

    建议43:让接口中的泛型参数支持协变 除了上一建议中提到的使用泛型参数兼容接口不可变性外,还有一种办法是为接口中的泛型声明加上out关键字来支持协变,如下所示: interface ISalary&l ...

  3. 获取request中的查询参数

    //获取request中的查询参数 public static Map<String, Object> getRequestParamsByMap(HttpServletRequest r ...

  4. 获取url中查询字符串参数

    // 获取url中查询字符串参数 例如http://www.test.com?a=1&b=2 function RequestParamete() { var url = window.loc ...

  5. springboot的restful风格获取请求中携带的参数

    http://localhost:8080/emp/1 有以上请求,我们controller要怎么获取请求中传递的参数1呢? 通过PathVariable注解,如下: @DeleteMapping(& ...

  6. 通过反射获取父类泛型的Class对象 ParameterizedType

    ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0] 这个方法这么用啊,返回什么,请给 ...

  7. C#通过反射获取类中的方法和参数个数,反射调用方法带参数

    using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...

  8. JS获取Url中传入的参数

    一:后台获取,前台调用 后台: object value= Request.QueryString[key]; 前台js: $(function(){ var value="<%=va ...

  9. jQuery获取地址栏中的链接参数

    http://caibaojian.com/177.html 问题描述 今天做一个主题,有一个需求是根据不同的页面来做,虽然php也可以做到,不过考虑到自己的特效代码都是在jQuery上完成,想着能否 ...

随机推荐

  1. 简单了解ddos攻击

    1.一种为流量攻击,主要是针对网络带宽的攻击,即大量攻击包导致网络带宽被阻塞,合法网络包被虚假的攻击包淹没而无法到达主机: 2.另一种为资源耗尽攻击,主要是针对服务器主机的攻击,即通过大量攻击包导致主 ...

  2. 使用async属性异步加载执行JavaScript

    HTML5让我兴奋的一个最大的原因是,它里面实现的新功能和新特征都是我们长久以来一直期待的.比如,我以前一直在使用placeholders,但以前必须要用JavaScript实现.而HTML5里给Ja ...

  3. 数据库连接工具类 数据库连接工具类——仅仅获得连接对象 ConnDB.java

    package com.util; import java.sql.Connection; import java.sql.DriverManager; /** * 数据库连接工具类——仅仅获得连接对 ...

  4. Myeclipse搭建struts2环境

    1.下载Struts2 到Apache Struts2官网下载最新的Struts2  http://struts.apache.org/download.cgi#struts2316-SNAPSHOT ...

  5. SPOJ #752. Power it!

    By property of mod operations , we can simply use Divide and Conquer + Recursion to solve it. Refere ...

  6. FFTW简介及使用

    http://fftw.org/ FFTW is a C subroutine library for computing the discrete Fourier transform (DFT) i ...

  7. linux下进程、端口号相互查看方法

    linux下通过进程名查看其占用端口: 1.先查看进程pid ps -ef | grep 进程名 2.通过pid查看占用端口 netstat -nap | grep 进程pid 例:通过nginx进程 ...

  8. 如何重装air

    参考这里 很多年没有装过系统了,手贱用xxcleaner清理了下,好吧,我觉得只能重装了,直接贴过程吧 ,开机同时command+R,进入菜单 ,抹掉磁盘 ,重启,等在线更新(看各位运气了,网速好的话 ...

  9. 源码安装extundelete以及对遇到问题的解决

    软件下载:http://sourceforge.net/projects/extundelete/ 1.在安装extundelete包./configure时遇到configure: error: C ...

  10. 利用mtd工具实现嵌入式设备在线升级

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   主要思路是:通过web post方式将升级文件交给CGI程序处理,然后通过mtd工具实现设备在线升级. 1.页面部分 & ...