5

有没有办法知道给定的类是否是一个封装原始类型的类,或者我是否必须制作一个像这样的丑陋方法:

public boolean isBoxingClass(Class clazz){
  String simpleName=clazz.getSimpleName();
  switch(simpleName){
    case "Integer":
    case "Long":
    case "Boolean":
    case "Double":
    case "Float":
      return true;
    default :
      return false;
  }
}

编辑:

如果最终选择了这个解决方案:

public static final List<Class> BOXING_CLASSES= Arrays.asList(new Class[]{
      Integer.class,
      Long.class,
      Short.class,
      Boolean.class,
      Double.class,
      Float.class,
      Character.class,
      Void.class,
      Byte.class});

public static boolean isBoxing(Class clazz){
  return BOXING_CLASSES.contains(clazz);
}
4

2 回答 2

2

这是我能想到的最简单的方法。包装类仅存在于java.lang包中。除了包装类之外,没有其他类java.lang具有名为TYPE. 您可以使用它来检查一个类是否是 Wrapper 类。

public static boolean isBoxingClass(Class<?> clazz)
{
    String pack = clazz.getPackage().getName();
    if(!"java.lang".equals(pack)) 
        return false;
    try 
    {
        clazz.getField("TYPE");
    } 
    catch (NoSuchFieldException e) 
    {
        return false;
    }           
    return true;        
}
于 2013-05-27T18:31:11.730 回答
-1

看看这个类是否实现了 Number,或者它是 Character 还是 Boolean(我认为这些是唯一的选择)怎么样?

public boolean isBoxingClass(Class clazz)
{   
    return Number.class.isAssignableFrom(clazz) ||
           Character.class.isAssignableFrom(clazz) || 
           Boolean.class.isAssignableFrom(clazz);
}

在这种情况下,例如,您会得到正确的结果。BigDecimal 和 AtomicInteger 也是如此,不确定这是否是您想要的。但无论如何你都不需要通过getSimpleName()。

于 2013-05-27T16:08:55.370 回答