【问题标题】:In Java, how do I dynamically determine the type of an array?在Java中,如何动态确定数组的类型?
【发布时间】:2008-10-17 16:12:33
【问题描述】:
Object o = new Long[0]
System.out.println( o.getClass().isArray() )
System.out.println( o.getClass().getName() )
Class ofArray = ???

运行前 3 行发出;

true
[Ljava.lang.Long;

我怎么得到???要长吗?我可以解析字符串并执行 Class.forname(),但这太糟糕了。有什么简单的方法?

【问题讨论】:

    标签: java


    【解决方案1】:

    随便写

    Class ofArray = o.getClass().getComponentType();
    

    来自the JavaDoc

    public Class<?> getComponentType()

    返回代表数组组件类型的Class。如果这个类不代表一个数组类,这个方法返回null

    【讨论】:

      【解决方案2】:

      http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getComponentType():

      public Class<?> getComponentType()
      

      返回代表数组组件类型的Class。如果这个类不代表一个数组类,这个方法返回null...

      【讨论】:

        【解决方案3】:

        @ddimitrov 是正确答案。放入代码如下:

        public <T> Class<T> testArray(T[] array) {
            return array.getClass().getComponentType();
        }
        

        更一般地说,我们可以先测试一下该类型是否代表一个数组,然后然后获取它的组件:

        Object maybeArray = ...
        Class<?> clazz = maybeArray.getClass();
        if (clazz.isArray()) {
            System.out.printf("Array of type %s", clazz.getComponentType());
        } else {
            System.out.println("Not an array");
        }
        

        一个具体的例子是将此方法应用于已知组件类型的数组:

        String[] arr = {"Daniel", "Chris", "Joseph"};
        arr.getClass().getComponentType();              // => java.lang.String
        

        非常简单!

        【讨论】:

        • 如果第一个元素为空怎么办,即 String[] arr = {null, "Chris", "Joseph"};
        • @Psycho,无论是否为 null,所有这些解决方案都使用反射,该反射基于存储的关于(可能)在运行时可用的类的元信息。反射通常是对类元信息的非法访问,在某些情况下我们可能不允许使用它...
        • 似乎更好的解决方案是首先检查 array.length 是否为零并返回,如果非零,则检查第一个元素的类型并获取类型信息,这不使用反射。但是,如果开发人员仍然想知道空数组的类型信息,那么似乎反射是唯一的选择。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 2020-03-23
        • 1970-01-01
        相关资源
        最近更新 更多