我经历过What code and how does java.lang.reflect.Array create a new array at runtime?。我知道它们是用母语('C')实现的,但我的问题是为什么几乎所有方法java.lang.reflect.Array类方法都是 native 。
我的猜测和理解是
我对Array类中的本机方法的理解是正确的还是我错过了什么?
答案 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
方法是性能,调度简单性和“为什么不”的组合的本机方法 - 它同样容易添加第二种或第三种原生方法。