java运行时获得泛型类型
引言
众所周知,java泛型最重要的特征是泛型擦除,所有泛型在编译时会转换成Object所以在java中运行时无法获得泛型的类型。
但是其实以上的规则是针对方法的内部变量的,如果是其他形式的泛型其实是可以获得内部类型的
类内部成员变量
public static void main(String[] arg) throws NoSuchFieldException, SecurityException{
Field f=Pojo.class.getField("list"); //反射获得泛型成员变量
System.out.println(f.getGenericType()); //输出成员变量类型
Type[] type=((ParameterizedType)f.getGenericType()).getActualTypeArguments(); //获得泛型的所有泛型参数
for(Type t:type){
System.out.println(t); //遍历输出各个参数
}
}
public static class Pojo{
public List<String> list; //泛型成员变量
}
-----------输出-------------
java.util.List<java.lang.String>
class java.lang.String
泛型父类/接口
public static void main(String[] arg) throws NoSuchFieldException, SecurityException{
List l=new ArrayList<String>(){}; //创建一个ArrayList内部类 注意这里后面加了{}是内部类而不是简单的arraylist
System.out.println(l.getClass().getGenericSuperclass()); //输出泛型父类
Type[] t2=((ParameterizedType)l.getClass().getGenericSuperclass()).getActualTypeArguments(); //获得泛型的所有泛型参数
for(Type t:t2){
System.out.println(t); //遍历输出各个参数
}
}
-----------输出-------------
java.util.ArrayList<java.lang.String>
class java.lang.String
这里的list是继承ArrayList<String>的子类,其父类是ArrayList<String>,只有父类/父接口拥有泛型参数才可以获得对应的泛型参数,直接写new ArrayList<String>()的输出结果就会是
java.util.AbstractList<E>
E
就无法获得泛型类型
应用
看到这里来说下以上功能的用处,最常见的用处是用于数据解析,比如jackson
ObjectMapper mapper = new ObjectMapper();
map = mapper.readValue(input, new TypeReference<Map<String, Object>>(){});
就是通过实现TypeReference接口产生子类来传递泛型参数的(同样后面带着{})来告诉框架期望转换成什么样的对象
总结
JDK保存这些信息想必是因为类继承时会需要相应泛型的范围是否正确,在日常开发中需要通过泛型传递类型可以用本文的方法
- 泛型成员变量
- 泛型父类/接口
来实现。
java运行时获得泛型类型的更多相关文章
- java运行时跟编译时的区别,欢迎大家指正
个人博客地址:https://blog.csdn.net/qq_41907991 关于java运行时及编译时期的区别: 首先我们要了解编译以及运行的概念: 编译就是指,编译器帮你把源码翻译成机器能识别 ...
- java运行时内存模式学习
学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...
- Jvm基础(1)-Java运行时数据区
最近在看<深入理解Java虚拟机>,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此.这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出. 首先把图贴上来 ...
- Java运行时内存
对于java程序员来说,并不必显示地对内存进行管理,一切都交给java虚拟机去做吧,而且,你也不一定做得比java虚拟机来得专业.好像所有内存管理都交给虚拟机去做就万事大吉了,但是,事实有时并非如此, ...
- 读书笔记-浅析Java运行时数据区
作为一个 Java 为主语言的程序员,我偶尔也需要 用 C/C++ 写程序,在使用时让我很烦恼的一件事情就是需要对 new 出来的对象进行 delete/free 操作,我老是担心忘了这件事情,从而导 ...
- Java运行时环境---内存划分
背景:听说Java运行时环境的内存划分是挺进BAT的必经之路. 内存划分: Java程序内存的划分是交由JVM执行的,而不像C语言那样需要程序员自己买单(C语言需要程序员为每一个new操作去配对del ...
- JVM发展史和Java运行时内存区域
目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...
- JAVA运行时异常及常见的5中RuntimeExecption
最近在抽时间看面试题,很多面试题都提出了写出java常见的5个运行时异常.现在来总结一下, java运行时异常是可能在java虚拟机正常工作时抛出的异常. java提供了两种异常机制.一种是运行时异常 ...
- Java 内存管理、JVM 工作原理与 Java 运行时系统
Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...
随机推荐
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- 前端框架 EasyUI (2)页面布局 Layout
在 Web 程序中,页面布局对应用程序的用户体验至关重要. 在一般的信息管理类的 Web 应用程序中,页面结构通常有一个主工作区,然后在工作区上下左右靠近边界的区域设置一些边栏,用于显示信息或放置一些 ...
- 02.SQLServer性能优化之---牛逼的OSQL----大数据导入
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 上一篇:01.SQLServer性能优化之----强大的文件组----分盘存储 http ...
- input[tyle="file"]样式修改及上传文件名显示
默认的上传样式我们总觉得不太好看,根据需求总想改成和上下结构统一的风格…… 实现方法和思路: 1.在input元素外加a超链接标签 2.给a标签设置按钮样式 3.设置input[type='file' ...
- EF上下文对象线程内唯一性与优化
在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...
- Autofac - 方法注入
方法注入, 其实就是在注册类的时候, 把这个方法也注册进去. 那么在生成实例的时候, 会自动调用这个方法. 其实现的方法, 有两种. 准备工作: public interface IAnimal { ...
- Div Vertical Menu ver5
这个小功能,如果是算此次,已经是第5次修改了.可以从这里看到前4次:V1, http://www.cnblogs.com/insus/archive/2011/10/17/2215637.html V ...
- python基础
内容概要: 一.python2 or python3 目前大多使用python2.7,随着时间的推移,python3将会成为python爱好者的主流. python2和3区别: 1.PRINT IS ...
- 灵魂宝石 bzoj 2663
灵魂宝石(1s 128MB)soulgem [问题描述] "作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形" 我们知道,魔法少女的生命被存放于一个称为灵魂宝 ...
- 三星Note 7停产,原来是吃了流程的亏
三星Note 7发售两个月即成为全球噩梦,从首炸到传言停产仅仅47天.所谓"屋漏偏逢连天雨",相比华为.小米等品牌对其全球市场的挤压.侵蚀,Galaxy Note 7爆炸事件这场连 ...