【问题标题】:How to return an instance of Class for an array of a given Class subtype?如何为给定 Class 子类型的数组返回 Class 实例?
【发布时间】:2019-09-16 16:35:14
【问题描述】:
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() 方法返回作为参数传递的类型的对象数组的类。

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

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

【问题讨论】:

  • 你可以用"[L"";"包围类名并调用Class.forName,但是创建数组实例也不错

标签: java arrays class


【解决方案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() + ";");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多