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

时间:2014-01-30 05:13:09

标签: java jvm

我经历过What code and how does java.lang.reflect.Array create a new array at runtime?。我知道它们是用母语('C')实现的,但我的问题是为什么几乎所有方法java.lang.reflect.Array类方法都是 native

我的猜测和理解是

  • 改善表现?或者通过JVM为数组分配连续内存?

我对Array类中的本机方法的理解是正确的还是我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

此类调用是native因为要执行它们,您必须移出Java并进入主机环境才能完成它们。在某些点,必须将每个操作移交给主机,以使用本地操作系统和硬件实际实现它。

答案 1 :(得分:3)

reflect.Array.newInstance方法使用本机代码,因为必须使用本机代码。这与性能没有任何关系,但是由于Java语言无法表达此操作。

为了表明它是语言限制并且与性能没有严格关系,这里有一些有效的代码可以创建一个新数组,而无需直接调用任何本机方法。

Object x = new String[0];

但是,newInstance接受Class<?>任意值,然后使用所表示的类型创建相应的数组。但是,这种结构在普通Java中不可能,它不能用类型系统或相应的普通“新数组”语法表示。

// This production is NOT VALID in Java, as T is not a type
// (T is variable that evaluates to an object representing a type)
Class<?> T = String.class;
Object x = new T[0];

// -> error: cannot find symbol T

由于不允许这样的生产,因此使用本机方法(可以访问JVM内部)来创建相应类型的新数组实例。


虽然以上争论newInstance需要本机的情况,但我相信许多其他reflect.Array方法(get / set方法)可以使用专门的铸造在普通Java中处理;在这些情况下,表现的论据占据主导地位。

但是,大多数代码都不使用数组反射(这包括“多值数据结构”,如ArrayList),而只是使用直接翻译的普通Java数组访问适当的Java bytecode ,不用通过reflect.Array或其使用的原生方法。


结论:

  • Java 已经通过JVM's执行bytecode提供快速数组访问。 HotSpot,“官方”JVM,是用C ++编写的,它是“本机”代码 - 但是这个与数组相关的字节码的执行是独立的 reflect.Array并且使用本机方法

  • newInstance使用原生方法,因为必须使用原生方法或dynamically generate and execute bytecode

  • 可以用Java表达的其他reflect.Array方法是性能,调度简单性和“为什么不”的组合的本机方法 - 它同样容易添加第二种或第三种原生方法。