首页 > 解决方案 > 如何为给定 Class 子类型的数组返回 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() 返回作为参数传递的类型的对象数组的类。

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

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

标签: javaarraysclass

解决方案


事实证明,以下工作非常好(使用在线编译器测试和验证):

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() + ";");
    }

推荐阅读