如何检查类是否代表特定的原始类型

问题描述

我需要确定特定的类是否为特定的原始类型,在我的情况下为int。我找到了Class.isPrimitive()方法,但是我不需要检查所有的原语,我需要一个特定的原语。我注意到类名称等于原始名称,并且考虑过检查candidateClass.getName().equals("int"),但这似乎是一种不好的做法(以及“魔术字符串”的用法)。

如何使用Java API正确检查特定的原始类型?

解决方法

每种原始类型的每个包装器都提供一个静态字段,其中包含这些包装器的原始类型的类。例如:Integer.TYPE

Class.isPrimitive文档提供了有关Java中基本类型类的实现的信息:

有九个预定义的Class对象代表八个基本类型和void。它们是由Java虚拟机创建的,并且具有与它们表示的原始类型相同的名称,即布尔值,字节,字符,short,int,long,float和double。 这些对象只能通过以下公共静态最终变量进行访问,并且是此方法为其返回true的唯一Class对象。

一些参考代码:

public class PrimitiveClassTest {
    static class Foo{
       public int a;
    }
    
    public static void main(String[] args) throws NoSuchFieldException,SecurityException {
        Class<?> intClass = Foo.class.getField("a").getType();
        System.out.println("obj.int field class: "+intClass);
        System.out.println("Integer.TYPE class:  "+Integer.TYPE);
        System.out.println("are they equal?      "+Integer.TYPE.equals(intClass));
    }
}

给出以下结果:

obj.int field class: int
Integer.TYPE class:  int
are they equal?      true
,

这可以大大简化为:

 intClass == int.class

这行得通,因为Class文档说:

原始Java类型(布尔,字节,字符,short,int,long,float和double)以及关键字void也表示为Class对象。