如何为给定Class子类型的数组返回Class的实例?

时间:2019-04-27 11:01:03

标签: java arrays class

import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        System.out.println(new Test().getClassOfArrayOfSerializable(String.class));
        System.out.println(new Test().getClassOfArrayOfSerializable(Date.class));
    }

    @SuppressWarnings("unchecked")
    private Class<? extends Serializable> getClassOfArrayOfSerializable(final Class<? extends Serializable> subtypeClass) {
        return (Class<Serializable>) Array.newInstance(subtypeClass, 0).getClass();
    }
}

上面的getClassOfArrayOfSerializable()方法返回作为参数传递的类型的对象数组的类。

如您所见,即使我实际上只需要数组的类,我也必须创建该数组的实例。

有没有办法避免实例化数组?

1 个答案:

答案 0 :(得分:1)

事实证明,以下方法效果很好(使用online compiler进行了测试和验证):

System.out.println(String[].class);
System.out.println(Date[].class);

产生所需的输出:

class [Ljava.lang.String;
class [Ljava.util.Date;

不需要数组的实例化-假设您事先知道所需的类,则可以简单地请求其封装数组的类类型。

但是,如果必须在运行时在给定类类型上找到数组类类型,我相信您唯一的选择是使用basin的建议(也已通过在线编译器验证为有效的解决方案) ):

Class.forName("[L" + className + ";");

作为一种方法:

 @SuppressWarnings("unchecked")
    private Class<? extends Serializable> getClassOfArrayOfSerializableNoArrayInitialization
        (final Class<? extends Serializable> subtypeClass) throws ClassNotFoundException
    {
        return (Class<Serializable>) Class.forName("[L" + subtypeClass.getName() + ";");
    }