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-使用反射获取类型信息相关推荐

  1. java反射获取泛型_如何通过Java反射获取泛型类型信息

    前言 关于Java泛型,很多人都有一个误解,认为Java代码在编译时会擦除泛型的类型,从而在运行时导致没法访问其类型,这其实并不完全正确,因为有一部分泛型信息是可以在运行时动态获取的,这部分信息基本能 ...

  2. Java 反射 ---- 获取方法信息

    这一章我们通过Java的反射获取某个类的全部信息,话不多说直接上代码. 先贴工具类获取类信息的方法: package com.wangjd;import java.lang.reflect.Metho ...

  3. (部署新java程序,程序报错,需copy的一个包)——java使用siger 获取服务器硬件信息...

    mcat-siger.sh  查看是否安装siger rsync -aPuv /usr/lib64/libsigar-amd64-linux.so $i:/usr/lib64/ java使用siger ...

  4. 1.9 通过反射获取注解信息

    使用注解修饰了类.方法.变量等成员之后,这些注解不会自己生效,必须由开发者提供相应的工具来提取处理.要想获取类.方法或变量的注解信息,必须通过 Java 的反射技术来获取 Annotation 对象, ...

  5. Delphi6/7/2007获取类型信息

    2010年2月10日 Delphi2010强化的反射 第一篇 http://hi.baidu.com/rarnu/blog/item/880c68810337f3d1bc3e1e9e.html 第二篇 ...

  6. CocosCreator之KUOKUO带你搞反射-获取电池信息

    摘要 在使用 CocosCreator 打包的原生应用中,我们可以通过引擎封装好的反射机制调用 Java 的静态方法,从而实现提示.相册.支付跳转等功能.本次内容为利用 jsb 读取返回的电池信息. ...

  7. Java编程思想--14类型信息

    第十四章类型信息 14.1 为什么需要RTTI 14.2 Class对象 Class对象 Class.forName(String s) 14.2.1字面类常量 14.2.2 泛化Class的引用 1 ...

  8. thinking in java 学习笔记 14 类型信息

    第十四章 类型信息 尼玛,刚刚看完了亚冠,恒大这样都被连扳3球,尼玛的垃圾孙祥,恨死了那个全北现代 好吧,回到学习上 运行时类型信息使得你可以再程序运行时发现和使用类型信息 本章讨论的是java如何让 ...

  9. java 通过反射获取调用类方法及属性

    首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中 反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做 ...

最新文章

  1. 皮一皮:时代不同了...
  2. 北美公司面试经验笔记
  3. WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理【01】
  4. 《那些年啊,那些事——一个程序员的奋斗史》——35
  5. 小冰与老东家微软达成战略合作,并宣布数亿元Pre-A轮融资,将全面开展商业化
  6. datagrid不显示 easy_VBA程序报错,用调试三法宝,bug不存在的
  7. 仿XP系统的任务栏菜单
  8. 《CLR via C#》精髓:静态类
  9. IDEA下载主题、修改主题、删除主题
  10. 计算机创业计划书800字大全,2017创业计划书范文800字
  11. 进销存软件哪个简单好用?
  12. ESP8266开启热点和TCP Server
  13. 2017深度学习装机清单 (附京东链接)
  14. 解决电脑蓝牙耳机默认音量过大的问题
  15. 微信小程序开发日记1
  16. Introduce Parameter Object (引入参数对象)
  17. VMware虚拟机+Kali linux 2021.2 下载和安装以及初始操作
  18. GPS公司内部管理系统
  19. VC++保存和读取文件中的汉字出现乱码
  20. k8s 中的资源配置

热门文章

  1. mysql查询雇员部门和性别_数据库管理系统MySQL实验
  2. y电容如何选型_开关电源中电容如何快速选型
  3. 【QR Code Generator】开源免费响应式QRcdr二维码生成网站源码
  4. centos 删除crontab_Centos 7 安装crontab及cron常用命令
  5. 百度爬虫页面自动繁殖程序+教程自动SEO优化
  6. 多主机远程桌面连接,系统自带的。tsmmc
  7. C#的多线程机制探索2
  8. sqlserver 常用存储过程集锦
  9. FCKEditor在.net的使用 cnblogs
  10. 如何在终端下截取一个完整长度的网页截图