我目前正在研究Java Collections Framework,我一直在问自己的一个引人入胜的问题是“所有这些集合如何实现Collection#toArray方法的通用版本”。从我在其他SO问题中读到的内容来看,它最有可能使用Array#newInstance。仅供参考,这就是Array#newInstance的声明方式:
public static Object newInstance(Class<?> componentType,
int... dimensions)
throws IllegalArgumentException,
NegativeArraySizeException
现在,我的问题是:如何使提供给该方法的信息足以生成指定类型的数组对象?
多维度方面并不困难,因为人们总是可以将N-dim数组构造为(N-1)-dim数组的单调度数组。
真正让我感到困惑的是如何从通过T[]
引用传递的Class<T>
对象创建Class<?>
类型的对象。
答案 0 :(得分:1)
如果您考虑一下,在Reflection API中使用这样的功能是有意义的。执行new SomeType[N]
时,编译器基本上编译为字节代码,表示创建一个新数组,组件类型为SomeType
,长度为N
。
因此,JVM必须在运行时已经有一些机制来评估这些指令,给定给定的组件类型和长度,分配一个新的数组。 new SomeType[N]
的唯一问题是组件类型在编译时是硬编码的。但是,如果在运行时给出了类型,那么对于JVM来说并不困难,因为JVM具有采用该类型的运行时机制。由于没有允许您使用动态类型创建数组的本机语法,因此Reflection API提供了一种方法来执行此操作。
答案 1 :(得分:0)
具有此功能并且jdk通过Array.newInstance方法提供此功能在逻辑上是正确的。但是实现是在jvm中,所以你不知道它们是如何在非开源jvm中完全实现它的。我建议你检查openJVM源代码,因为它们提供了类似的功能。