Java获取泛型T的类型 T.class
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相关推荐
- [转载] Java获取泛型T的类型 T.class
参考链接: Java中的抽象 import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public cla ...
- 【转】Java获取泛型T的具体类型
在日常的开发中特别是框架的设计或者实用反射的时候,经常会实用class类去做一些事情,但是由于系统的抽象等问题,经常实用泛型去做一些事情.所以如何在泛型中获取具体的class类呢? 解决方案:父类本身 ...
- Java通过泛型的模板类型实例化对象
Java通过泛型的模板类型实例化对象 最近自己研究了下mvvm框架,使用泛型的方式可节省很多代码,并且可以合并很多冗余代码,为了最大化的精简代码想到了通过泛型的type用反射的方式实例化对象,这样对象 ...
- java 获取泛型的type,如何获取泛型的Type类型
开发中很多时候都遇到或使用到泛型.例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken. Type:是java里的 java.lang.reflect.Typ ...
- java获取泛型的类型_Java反射获取泛型类型
public class Person{ }importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;public ...
- java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
第三节 泛型 3.1为什么需要泛型 没有采用泛型之前 1.不安全:添加元素是无检查 宽进 2.繁琐:获取元素时需要强制类型转换 严出 采用泛型之后 1.安全 严进 2.简单 宽出 3.2什么是泛型ge ...
- java 获取子类实际的类型名_Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例...
前言: 要点都在代码注释中 1.泛型类 GenericInterface package com.demo.generic; import java.lang.reflect.Parameterize ...
- java 获取泛型_聊聊Java泛型擦除那些事
>版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...
- java 获取泛型的属性_java在泛型类 T 上利用反射取属性值
记录一次反射的使用,第一次真正运用到实际工作中,发现反射是真的强大! 写了一个通用类,主要是便于和 db 的交互操作,使用到了泛型 T 对象,但是有一步需要获取该对象的属性 id 值(前提是所有赋值给 ...
最新文章
- pandas把dataframe的数据列转化为索引列实战:单列转化为索引、多列转化为复合索引
- Visual Studio 2005 通过静态变量及可系列化的HASHTABLE变量优化工厂模式(Factory)的效率,提升性能(E8.Net工作流应用系统优化系列四)...
- oracle触发器的测试,ORACLE触发器的测试
- python常用的库有哪些餐厅_这十个Python常用库,学习Python的你必须要知道!
- 关于操作系统中英文切换的.po和.mo介绍
- java安装pydev找不到_为什么安装成功也重启了,但是在window-preferences里找不到PyDev...
- GameObject.Find() 和 Transform.Find()的区别
- python label显示图片_Python3 tkinter基础 Label imag显示图片
- 备份自查-微博错误代码
- BBU和RRU具体区别是 什么?
- ArcGIS 线简化算法的使用及两种方法的比较
- Centos+Aria2+AriaNg+Trancers更新
- 微头条快速赚钱变现方法,一天可赚100元
- 第4章 计算机网络自顶向下——网络层:数据平面
- 向oracle中插入图片和读取图片
- 2、java的应用领域
- 《.NET并发编程实战》之 函数式并发基础
- JVM垃圾回收器工作原理及使用实例介绍
- 微信商家券对接wechatpay-apiv3
- Mac如何安装:node的多版本管理工具(nvm 或 n)
热门文章
- nextcloud icon_吉利ICON,我信任的好伙伴,感谢有你的陪伴
- feign 序列化_Spring Cloud Feign 配置 FastJson
- 崩坏三x86架构闪退_不给X86留活路?苹果下一代M系列芯片竟然这么强
- ps自定义形状工具_【福利】3000款PS自定义形状免费打包下载
- linux性能并发 带机量,性能测试笔记(一):吞吐量与并发数
- php获取当前周得周一_php一行代码获取本周一,本周日,上周一,上周日,本月一日,本月最后一日,上月一日,上月最后一日日期...
- 关于主机的思维导图_读《思维导图》系列丛书----我用思维导图做什么?
- 网页单机怎么用服务器修改元宝,[一键安装] 网页游戏热血战纪半一键端,附加架设方法+元宝修改!...
- simulink和psim仿真结果不同_CAE仿真分析规范是什么?涨知识啦!
- html清除矩形边区域,canvas清除矩形指定颜色