判断一个类是否为基础类型属于常规操作了,一般我们遇到这种case,要怎么处理呢?
一个一个的if/else判断? 还是其他的操作姿势?
1. 基础类型判断
基础类型可以借助class类的isPrimitive
方法来实现判定,使用姿势也简单
obj.getClass().isPrimitive() 复制代码
如果返回true,那么这个对象就是基本类型
- boolean
- char
- byte
- short
- int
- long
- float
- double
- void
但是请注意,对于封装类型,比如Long,访问isPrimitive返回的是false
2. 封装类型判断
那么封装类型可以怎么判断呢?难道一个一个的判定不成?
首先我们注意到Class#isPrimitive
的方法签名,如下
/** * @see java.lang.Boolean#TYPE * @see java.lang.Character#TYPE * @see java.lang.Byte#TYPE * @see java.lang.Short#TYPE * @see java.lang.Integer#TYPE * @see java.lang.Long#TYPE * @see java.lang.Float#TYPE * @see java.lang.Double#TYPE * @see java.lang.Void#TYPE * @since JDK1.1 */ public native boolean isPrimitive(); 复制代码
上面的注释中,提到了Boolean#Type之类的静态成员,也就是说包装类型,都有一个TYPE的静态成员
比如boolean的是这个
@SuppressWarnings("unchecked") public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean"); 复制代码
所以我们可以通过这个TYPE来判定,当前对象是否为封装对象
try { return ((Class) clz.getField("TYPE").get(null)).isPrimitive(); } catch (Exception e) { return false; } 复制代码
如果Class对象没有TYPE字段,那么就不是封装类,直接抛异常,返回false;当然这种通过异常的方式来判定,并不优雅;但是写法上比我们一个一个的if/else进行对比,要好得多了