JVM是如何实现数组的类的?

Gev*_*Gev 0 java jvm

我可以重写 的任何方法吗array
例如toString()或其他方法。

import java.lang.reflect.Method;

public class ArraysClassTest {
    static int[] array = { 1, 2, 3, 1 };

    public static void main(String[] args) {
        Class<? extends int[]> class1 = array.getClass();
        try {
            Method method = class1.getMethod("toString");
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

Boa*_*ann 7

您无法更改数组的任何功能。JLS \xc2\xa710.7 Array Members指定数组的每个成员:

\n\n
\n

数组类型的成员如下:

\n\n
    \n
  • 字段public finallength包含数组的组成部分的数量。length可以是正数或零。

  • \n
  • 方法,它重写类中同名的方法并且不抛出已检查的异常public。数组类型的方法的返回类型是。cloneObjectcloneT[]T[]

    \n\n

    多维数组的克隆是浅的,也就是说它仅创建一个新数组。子数组是共享的。

  • \n
  • 所有从类继承的成员Object;唯一Object不被继承的方法是它的clone方法。

  • \n
\n
\n\n

该规范不允许以任何方式自定义此实现。toString()例如,数组的方法始终是从 继承的基本方法Object

\n\n

为了创建数组对象,编译器会向已编译的Java 字节码发出三个指令之一:newarray对于基元、anewarray对于引用类型或multinewarray对于所有多维数组。在实现这些指令时,虚拟机根据运行时的需要创建每个数组类(JVMS \xc2\xa75.3.3创建数组类)。VM 还为编译器定义了专用字节码指令,用于获取和设置数组元素以及获取数组的长度。

\n\n

没有指定如何在虚拟机内实现阵列。它纯粹是一个实现细节,甚至 Java 编译器也不知道,也不关心。涉及的实际代码取决于您运行程序的虚拟机的风格、该 VM 的版本、其运行的操作系统和 CPU,以及 VM 配置的任何相关运行时选项(例如,无论是否处于解释模式)。

\n\n

快速浏览一下 OpenJDK 8 源代码就会发现一些与数组相关的机制:

\n\n\n\n

由于数组是该语言和虚拟机的核心功能,因此不可能指向任何一个源文件并说“这里,这就是代码class Array”。数组很特殊,实现它们的机制实际上无处不在。

\n\n
\n\n

如果你想自定义数组的行为,你唯一能做的就是不直接使用数组,而是使用、子类化或编写内部包含数组的集合类。这使您可以完全自由地定义类的行为和性能特征。但是,不可能使自定义类成为Java 语言意义上的数组。这意味着您无法使其实现[]运算符或可传递给需要数组的方法。

\n