import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;public class Main{public static void main(String[] args){Foo<String> foo = new Foo<String>(){};// 在类的外部这样获取Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];System.out.println(type);// 在类的内部这样获取System.out.println(foo.getTClass());}
}abstract class Foo<T>{public Class<T> getTClass(){Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];return tClass;}
}

输出:

class java.lang.String
class java.lang.String

上面的代码不是万能的,只有实例化T的子类才能按上述方法获得T的实际类型, 
如果子类没有实例化T,则无法获取T的实际类型; 
比如,class Child 并没有实例化T,所以得不到String.class;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;public class Main{public static void main(String[] args){//区别在new Child<String>()没有{}匿名类Foo<String> foo = new Child<String>();// 在类的外部这样获取Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];System.out.println(type);// 在类的内部这样获取System.out.println(foo.getTClass());}
}abstract class Foo<T>{public Class<T> getTClass(){Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];return tClass;}
}class Child<T> extends Foo<T>{
}

输出:

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedTypeat com.hankcs.Main.main(Main.java:9)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)

有一种解决方式,父类本身不获取泛型的具体类型,仅提供抽象方法,由子类来提供具体的类型

public abstract class Foo<T> {  public abstract Class getEntityClass();
}  public class Child extends Foo<String> {  public Class getEntityClass() {  return String.class;  }
}  

对于获取泛型的方法,比较完整的代码如下:

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;public class GenericsUtils {/*** 通过反射,获得定义Class时声明的父类的范型参数的类型. 如public BookManager extends* GenricManager<Book>* * @param clazz The class to introspect* @return the first generic declaration, or <code>Object.class</code> if cannot be determined*/public static Class getSuperClassGenricType(Class clazz) {return getSuperClassGenricType(clazz, 0);}/*** 通过反射,获得定义Class时声明的父类的范型参数的类型. 如public BookManager extends GenricManager<Book>* * @param clazz clazz The class to introspect* @param index the Index of the generic ddeclaration,start from 0.*/public static Class getSuperClassGenricType(Class clazz, int index)throws IndexOutOfBoundsException {Type genType = clazz.getGenericSuperclass();if (!(genType instanceof ParameterizedType)) {return Object.class;}Type[] params = ((ParameterizedType) genType).getActualTypeArguments();if (index >= params.length || index < 0) {return Object.class;}if (!(params[index] instanceof Class)) {return Object.class;}return (Class) params[index];}
}

转载来源: 
http://blog.csdn.net/wangjunjun2008/article/details/43970217 
http://www.hankcs.com/program/t-class.html 
https://www.cnblogs.com/sirab415/p/6133533.html

Java获取泛型T的类型 T.class相关推荐

  1. [转载] Java获取泛型T的类型 T.class

    参考链接: Java中的抽象 import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public cla ...

  2. 【转】Java获取泛型T的具体类型

    在日常的开发中特别是框架的设计或者实用反射的时候,经常会实用class类去做一些事情,但是由于系统的抽象等问题,经常实用泛型去做一些事情.所以如何在泛型中获取具体的class类呢? 解决方案:父类本身 ...

  3. Java通过泛型的模板类型实例化对象

    Java通过泛型的模板类型实例化对象 最近自己研究了下mvvm框架,使用泛型的方式可节省很多代码,并且可以合并很多冗余代码,为了最大化的精简代码想到了通过泛型的type用反射的方式实例化对象,这样对象 ...

  4. java 获取泛型的type,如何获取泛型的Type类型

    开发中很多时候都遇到或使用到泛型.例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken. Type:是java里的 java.lang.reflect.Typ ...

  5. java获取泛型的类型_Java反射获取泛型类型

    public class Person{ }importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;public ...

  6. java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3

    第三节 泛型 3.1为什么需要泛型 没有采用泛型之前 1.不安全:添加元素是无检查 宽进 2.繁琐:获取元素时需要强制类型转换 严出 采用泛型之后 1.安全 严进 2.简单 宽出 3.2什么是泛型ge ...

  7. java 获取子类实际的类型名_Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例...

    前言: 要点都在代码注释中 1.泛型类 GenericInterface package com.demo.generic; import java.lang.reflect.Parameterize ...

  8. java 获取泛型_聊聊Java泛型擦除那些事

    >版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...

  9. java 获取泛型的属性_java在泛型类 T 上利用反射取属性值

    记录一次反射的使用,第一次真正运用到实际工作中,发现反射是真的强大! 写了一个通用类,主要是便于和 db 的交互操作,使用到了泛型 T 对象,但是有一步需要获取该对象的属性 id 值(前提是所有赋值给 ...

最新文章

  1. pandas把dataframe的数据列转化为索引列实战:单列转化为索引、多列转化为复合索引
  2. Visual Studio 2005 通过静态变量及可系列化的HASHTABLE变量优化工厂模式(Factory)的效率,提升性能(E8.Net工作流应用系统优化系列四)...
  3. oracle触发器的测试,ORACLE触发器的测试
  4. python常用的库有哪些餐厅_这十个Python常用库,学习Python的你必须要知道!
  5. 关于操作系统中英文切换的.po和.mo介绍
  6. java安装pydev找不到_为什么安装成功也重启了,但是在window-preferences里找不到PyDev...
  7. GameObject.Find() 和 Transform.Find()的区别
  8. python label显示图片_Python3 tkinter基础 Label imag显示图片
  9. 备份自查-微博错误代码
  10. BBU和RRU具体区别是 什么?
  11. ArcGIS 线简化算法的使用及两种方法的比较
  12. Centos+Aria2+AriaNg+Trancers更新
  13. 微头条快速赚钱变现方法,一天可赚100元
  14. 第4章 计算机网络自顶向下——网络层:数据平面
  15. 向oracle中插入图片和读取图片
  16. 2、java的应用领域
  17. 《.NET并发编程实战》之 函数式并发基础
  18. JVM垃圾回收器工作原理及使用实例介绍
  19. 微信商家券对接wechatpay-apiv3
  20. Mac如何安装:node的多版本管理工具(nvm 或 n)

热门文章

  1. nextcloud icon_吉利ICON,我信任的好伙伴,感谢有你的陪伴
  2. feign 序列化_Spring Cloud Feign 配置 FastJson
  3. 崩坏三x86架构闪退_不给X86留活路?苹果下一代M系列芯片竟然这么强
  4. ps自定义形状工具_【福利】3000款PS自定义形状免费打包下载
  5. linux性能并发 带机量,性能测试笔记(一):吞吐量与并发数
  6. php获取当前周得周一_php一行代码获取本周一,本周日,上周一,上周日,本月一日,本月最后一日,上月一日,上月最后一日日期...
  7. 关于主机的思维导图_读《思维导图》系列丛书----我用思维导图做什么?
  8. 网页单机怎么用服务器修改元宝,[一键安装] 网页游戏热血战纪半一键端,附加架设方法+元宝修改!...
  9. simulink和psim仿真结果不同_CAE仿真分析规范是什么?涨知识啦!
  10. html清除矩形边区域,canvas清除矩形指定颜色