有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java检测装箱类

有没有办法知道一个给定的类是否是一个包含基元类型的类,或者我是否必须创建一个像这样难看的方法:

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);
}

共 (2) 个答案

  1. # 1 楼答案

    看看这个类是否实现了数字、字符或布尔值(我认为这是唯一的选项),怎么样

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

    在这种情况下,对于BigDecimal和AtomicInteger,你也会得到true,不确定这是否是你想要的。但在任何情况下,都不需要通过getSimpleName()

  2. # 2 楼答案

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

    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;        
    }