为什么大多数java.lang.reflect.Array类方法都是';本地';

为什么大多数java.lang.reflect.Array类方法都是';本地';,java,jvm,Java,Jvm,我经历过,。我知道它们是用本机语言(“C”)实现的,但我的问题是为什么几乎所有的方法java.lang.reflect.Array类方法都是本机的 我的猜测和理解是 提高绩效?还是通过JVM为阵列分配连续内存 我对数组类中本机方法的理解是否正确,或者我是否遗漏了什么 数组是所有多值数据结构的核心。阵列需要使用主机上的内存段,这意味着以安全且特定于机器的方式访问内存,这需要调用底层操作系统 这样的调用是本机的,因为要执行它们,您必须移出java并进入主机环境才能完成它们。在某些情况下,每个操作

我经历过,。我知道它们是用本机语言(“C”)实现的,但我的问题是为什么几乎所有的方法java.lang.reflect.Array类方法都是本机的

我的猜测和理解是

  • 提高绩效?还是通过JVM为阵列分配连续内存

我对数组类中本机方法的理解是否正确,或者我是否遗漏了什么

数组是所有多值数据结构的核心。阵列需要使用主机上的内存段,这意味着以安全且特定于机器的方式访问内存,这需要调用底层操作系统


这样的调用是
本机的
,因为要执行它们,您必须移出java并进入主机环境才能完成它们。在某些情况下,每个操作都必须移交给主机,以便使用本地操作系统和硬件实际执行。

阵列是所有多值数据结构的核心。阵列需要使用主机上的内存段,这意味着以安全且特定于机器的方式访问内存,这需要调用底层操作系统

这样的调用是
本机的
,因为要执行它们,您必须移出java并进入主机环境才能完成它们。在某些情况下,每个操作都必须移交给主机,以便使用本地操作系统和硬件实际实现。

该方法使用本机代码,因为它必须使用本机代码。这与性能没有本质上的关系,但这是Java语言无法表达此操作的结果

为了说明这是一种语言限制,并且与性能没有严格的关系,下面是一些有效的代码,它们在不直接调用任何本机方法的情况下创建了一个新数组

Object x = new String[0];
但是,
newInstance
接受一个任意值
Class
,然后用表示的类型创建相应的数组。但是,这种构造在普通Java中是不可能的,并且不能用类型系统或相应的正常“新数组”语法来表示

//此产品在Java中无效,因为T不是类型
//(T是一个变量,其计算结果为表示类型的对象)
Class T=String.Class;
对象x=新的T[0];
//->错误:找不到符号T
因为不允许这样的生产,所以使用本机方法(可以访问JVM内部)来创建相应类型的新数组实例


虽然上面提到了
newInstance
需要本地的情况,但我相信许多其他
reflect.Array
方法(即get/set方法)可以通过使用专门的转换在普通Java中处理;在这些情况下,性能的论点占主导地位

但是,大多数代码不使用数组反射(这包括“多值数据结构”,如),而只是使用普通的Java数组访问,直接将其转换为适当的数组,而无需通过
reflect.Array
或它使用的本机方法


结论:

  • Java已经通过执行提供了快速数组访问,“官方”JVM是用C++编写的,它是“原生”代码,但是这种与数组相关的字节码的执行与代码< >反射。数组< /代码>和使用本机方法无关。

  • newInstance
    使用本机方法,因为它必须使用本机方法或其他方法

  • 其他可以用Java表示的
    reflect.Array
    方法是本机方法,它们结合了性能、分派简单性和“为什么不”——添加第二个或第三个本机方法同样容易

  • Object x = new String[0];
    
该方法使用本机代码,因为它必须使用本机代码。这与性能没有本质上的关系,但这是Java语言无法表达此操作的结果

为了说明这是一种语言限制,并且与性能没有严格的关系,下面是一些有效的代码,它们在不直接调用任何本机方法的情况下创建了一个新数组

Object x = new String[0];
但是,
newInstance
接受一个任意值
Class
,然后用表示的类型创建相应的数组。但是,这种构造在普通Java中是不可能的,并且不能用类型系统或相应的正常“新数组”语法来表示

//此产品在Java中无效,因为T不是类型
//(T是一个变量,其计算结果为表示类型的对象)
Class T=String.Class;
对象x=新的T[0];
//->错误:找不到符号T
因为不允许这样的生产,所以使用本机方法(可以访问JVM内部)来创建相应类型的新数组实例


虽然上面提到了
newInstance
需要本地的情况,但我相信许多其他
reflect.Array
方法(即get/set方法)可以通过使用专门的转换在普通Java中处理;在这些情况下,性能的论点占主导地位

但是,大多数代码不使用数组反射(这包括“多值数据结构”,如),而只是使用普通的Java数组访问,直接将其转换为适当的数组,而无需通过
reflect.Array
或它使用的本机方法


结论:

  • Java已经通过执行提供了快速数组访问,“官方”JVM是用C++编写的,它是“原生”代码,但是这种与数组相关的字节码的执行与代码< >反射。数组< /代码>和使用本机方法无关。

  • newInstance
    使用本机方法,因为它必须使用本机方法或其他方法

  • 其他
    reflect.Arra