Java-使用反射获取类型信息
2019独角兽企业重金招聘Python工程师标准>>>
一个简单类的例子
在这个类中,有普通的String类型,有数组类型,有带泛型的List类型,有嵌套List类型,以及有多个泛型参数的简单类,这个类将作为我们后面的内容的基础。我们这一次博客解析如何使用反射获取到不同属性的类型值。
public class Some{private String name;private Integer[] numbers;private List<String> list;private List<List<Double>> matrix;private Map<String,Class> map;//ignore getter and setter
}
分析如何获取不同属性的类型
1、普通类型
普通类型的变量直接field.getType()即可以获取到他们的类型
public void queryNameType() throws NoSuchFieldException {Field field = Some.class.getDeclaredField("name");Class<?> type = field.getType();assertEquals(type,String.class);
}
2、数组类型
数组类型不像其他的类型可以通过isAssignableFrom()函数来进行判断,他需要使用isArray() 来判断该type是否是一个数组类型,然后使用getComponentType() 获取他的元素的类型
public void queryArrayType() throws NoSuchFieldException {Field field = Some.class.getDeclaredField("numbers");Class<?> type = field.getType();//一般来说,判断是否是某种类型是可以使用isAssignableFrom// 判断是否是数组类型比较特殊,要使用isArray()这个函数if (type.isArray()){//获得数组的类型,使用getComponentType()这个方法Class<?> componentType = type.getComponentType();assertEquals(componentType,Integer.class);}else{throw new IllegalStateException();}
}
3、带泛型的类型
带泛型的类型就是类似于List<String>这样的类型,我们现在的任务就是获取到String这个类型。
ParameterizedType表示参数化的类型,例如Collection这样的类型。我们可以通过getGenericType()方法获得该子类,当你的类型带有参数的时候就会返回ParameterizedType,否则会返回普通的类型(class)
那么具体是怎么操作的呢?
以获得List<T>的类型为例子
public void getListType() throws NoSuchFieldException {Field field = Some.class.getDeclaredField("list");//如果类似于List<String>这样的类型就是一种GenericType//注意这是一种Type类型Type type = field.getGenericType();if (type instanceof ParameterizedType){//泛型参数类型ParameterizedType parameterizedType = (ParameterizedType)type;Type[] actualTypes = parameterizedType.getActualTypeArguments();//因为List<String>获得第一个泛型参数,因为只有一个,我们取第一个//如果我们有多个泛型参数,我们可以根据顺序取不同的泛型参数assertEquals(actualTypes[0],String.class);//如果获得List这个原始类型呢?assertEquals(parameterizedType.getRawType(),List.class);}else{throw new IllegalStateException();}
}
4、复杂的嵌套类型
假如是List<List<String>> 如何获得最里面的类型呢?
例子如下
public void getSubListType() throws NoSuchFieldException {//思考一下,如果我们有一个嵌套List,我们想拿到嵌套在最里面的类型,那么我们可以这么做呢?//其实我们可以使用递归的思想去获得最里面的类型Field field = Some.class.getDeclaredField("matrix");assertEquals(getBaseType(field.getGenericType()),Double.class);}public static Type getBaseType(Type genericReturnType){Objects.requireNonNull(genericReturnType);if (genericReturnType instanceof ParameterizedType &&List.class.isAssignableFrom((Class)(((ParameterizedType) genericReturnType).getRawType()))){Type[] actualTypeArguments = ((ParameterizedType)genericReturnType).getActualTypeArguments();Type type = actualTypeArguments[0];return getBaseType(type);}else{return genericReturnType;}}
5、多个泛型参数
与第三个例子相似,只需要使用actualTypes数组按顺序取即可
例子如下
public void getMapType() throws NoSuchFieldException {Field field = Some.class.getDeclaredField("map");Type type = field.getGenericType();if (type instanceof ParameterizedType){ParameterizedType parameterizedType = (ParameterizedType)type;Type[] actualTypes = parameterizedType.getActualTypeArguments();assertEquals(actualTypes[0],String.class);assertEquals(actualTypes[1],Class.class);}else{throw new IllegalStateException();}
}
总结
以上总结了几种常用的使用反射获取属性类型的例子,稍加改造就可以写自己的工具类了。希望对大家有帮助^_^
转载于:https://my.oschina.net/u/2391658/blog/3054414
Java-使用反射获取类型信息相关推荐
- java反射获取泛型_如何通过Java反射获取泛型类型信息
前言 关于Java泛型,很多人都有一个误解,认为Java代码在编译时会擦除泛型的类型,从而在运行时导致没法访问其类型,这其实并不完全正确,因为有一部分泛型信息是可以在运行时动态获取的,这部分信息基本能 ...
- Java 反射 ---- 获取方法信息
这一章我们通过Java的反射获取某个类的全部信息,话不多说直接上代码. 先贴工具类获取类信息的方法: package com.wangjd;import java.lang.reflect.Metho ...
- (部署新java程序,程序报错,需copy的一个包)——java使用siger 获取服务器硬件信息...
mcat-siger.sh 查看是否安装siger rsync -aPuv /usr/lib64/libsigar-amd64-linux.so $i:/usr/lib64/ java使用siger ...
- 1.9 通过反射获取注解信息
使用注解修饰了类.方法.变量等成员之后,这些注解不会自己生效,必须由开发者提供相应的工具来提取处理.要想获取类.方法或变量的注解信息,必须通过 Java 的反射技术来获取 Annotation 对象, ...
- Delphi6/7/2007获取类型信息
2010年2月10日 Delphi2010强化的反射 第一篇 http://hi.baidu.com/rarnu/blog/item/880c68810337f3d1bc3e1e9e.html 第二篇 ...
- CocosCreator之KUOKUO带你搞反射-获取电池信息
摘要 在使用 CocosCreator 打包的原生应用中,我们可以通过引擎封装好的反射机制调用 Java 的静态方法,从而实现提示.相册.支付跳转等功能.本次内容为利用 jsb 读取返回的电池信息. ...
- Java编程思想--14类型信息
第十四章类型信息 14.1 为什么需要RTTI 14.2 Class对象 Class对象 Class.forName(String s) 14.2.1字面类常量 14.2.2 泛化Class的引用 1 ...
- thinking in java 学习笔记 14 类型信息
第十四章 类型信息 尼玛,刚刚看完了亚冠,恒大这样都被连扳3球,尼玛的垃圾孙祥,恨死了那个全北现代 好吧,回到学习上 运行时类型信息使得你可以再程序运行时发现和使用类型信息 本章讨论的是java如何让 ...
- java 通过反射获取调用类方法及属性
首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中 反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做 ...
最新文章
- 皮一皮:时代不同了...
- 北美公司面试经验笔记
- WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理【01】
- 《那些年啊,那些事——一个程序员的奋斗史》——35
- 小冰与老东家微软达成战略合作,并宣布数亿元Pre-A轮融资,将全面开展商业化
- datagrid不显示 easy_VBA程序报错,用调试三法宝,bug不存在的
- 仿XP系统的任务栏菜单
- 《CLR via C#》精髓:静态类
- IDEA下载主题、修改主题、删除主题
- 计算机创业计划书800字大全,2017创业计划书范文800字
- 进销存软件哪个简单好用?
- ESP8266开启热点和TCP Server
- 2017深度学习装机清单 (附京东链接)
- 解决电脑蓝牙耳机默认音量过大的问题
- 微信小程序开发日记1
- Introduce Parameter Object (引入参数对象)
- VMware虚拟机+Kali linux 2021.2 下载和安装以及初始操作
- GPS公司内部管理系统
- VC++保存和读取文件中的汉字出现乱码
- k8s 中的资源配置