16.如何判断类为基础类型or基础类型的包装类

一灰灰blogJava编程技巧JDK编程技巧约 451 字大约 2 分钟

实战16:判断类为基础类型or基础类型的包装类

判断一个类是否为基础类型属于常规操作了,一般我们遇到这种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进行对比,要好得多了

Loading...