Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Array.newInstance()是如何工作的?_Java_Arrays_Generics - Fatal编程技术网

Java Array.newInstance()是如何工作的?

Java Array.newInstance()是如何工作的?,java,arrays,generics,Java,Arrays,Generics,我目前正在研究Java集合框架,我一直在问自己的一个有趣的问题是“所有这些集合如何实现方法的通用版本?”。从我在其他SO问题中读到的内容来看,它很可能使用。仅供参考,以下是数组#newInstance的声明方式: public static Object newInstance(Class<?> componentType, int... dimensions) throws IllegalArgum

我目前正在研究Java集合框架,我一直在问自己的一个有趣的问题是“所有这些集合如何实现方法的通用版本?”。从我在其他SO问题中读到的内容来看,它很可能使用。仅供参考,以下是数组#newInstance的声明方式:

public static Object newInstance(Class<?> componentType,
                     int... dimensions)
                     throws IllegalArgumentException,
                            NegativeArraySizeException
公共静态对象newInstance(类componentType,
内部…尺寸)
抛出IllegalArgumentException,
NegativeArraySizeException
现在,我的问题是:如何使提供给该方法的信息足以生成指定类型的数组对象

多维性方面并没有那么困难,因为人们总是可以将N-dim阵列构造为(N-1)-dim阵列的单个dim阵列。
真正困扰我的是如何从通过
引用传递的
对象创建类型为
T[]
的对象。

具有此功能在逻辑上是正确的,jdk提供了Array.newInstance方法。但是实现是在jvm内部的,所以您无法知道他们是如何在非开源jvm中实现这一点的。我建议您检查openJVM源代码,因为它们提供了类似的功能。

如果您仔细想想,在反射API中使用这样的功能是有意义的。当您执行
newsometype[N]
时,编译器基本上会将以下内容编译成字节码:创建一个新数组,其中包含组件类型
SomeType
,长度
N


因此JVM在运行时必须已经有某种机制来评估这些指令,即给定给定的组件类型和长度,分配一个新数组。
newsometype[N]
的唯一问题是组件类型在编译时是硬编码的。但是,如果类型是在运行时给出的,那么JVM就不再困难了,因为JVM有一个接受该类型的运行时机制。由于没有本地语法允许您创建具有动态类型的数组,因此反射API提供了一种方法来执行此操作。

在Oracle JDK
newInstance
中,委托给一个
private
native
方法,该方法实际返回新数组。实际的创建是由JVM动态完成的。@SotiriosDelimanolis,因此,这个方法实际上是创建一个在运行时提供类型的数组的唯一方法?使用Java本身提供的工具无法达到同样的效果?您无法做到这一点-运行时不存在泛型。如果再次查看集合的API,可以看到toArray的空参数版本返回一个对象[]。要获得参数化/类型化数组,必须首先创建该数组并将其传递到方法中。是的,这是唯一的方法(减去一些可序列化的
,但忽略它)。谢谢您的输入。尽管我的主要问题是,是否可以通过不依赖任何本机方法来实现
Array.newInstance
提供的相同功能。显然@SotiriosDelimanolis已经在他的评论中给出了答案。