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