Java JVM如何实现数组';什么课?

Java JVM如何实现数组';什么课?,java,jvm,Java,Jvm,我可以重写数组的任何方法吗? 例如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();

我可以重写
数组的任何方法吗?
例如
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();
        }
    }
} 
import java.lang.reflect.Method;
公共类数组类测试{
静态int[]数组={1,2,3,1};
公共静态void main(字符串[]args){
类在Java中,所有数组(包括基元类型的数组)都将
Java.lang.Object
作为其基类(一方面,这是零长度数组的建模方式)


尽管可以重写该基类中的任何方法,但Java本身指定了数组的形式。您不能干预这一点:尤其是您不能扩展数组。

回答您的直接问题:不,您不能

数组是一种“编译器”构造—编译器知道字符串[]的含义;并由此创建相应的字节码。您只能创建数组对象,但不能创建“新数组类”。除此之外,JVM还知道如何处理“使用”字节码指令的数组

换句话说:定义某个对象数组行为的源代码完全不在您的控制范围内。数组只做数组所做的事情;您没有办法干涉它

为了回答你隐含的问题,为什么事情是这样的:

有时没有太多的东西需要理解,但要简单地接受。事实上,Java语言是在20多年前创建的;在某个时候,一些人做出了一些设计选择。其中许多是优秀的;如果我们现在重做的话,其中一些可能已经得到了处理


例如,您会发现Scala处理数组的方式有所不同。但对于java来说,一切都是如此;尤其是对于作为数组的语言“如此核心”的东西,现在改变这些根本没有意义。

您可以创建一个代理并使用它来代替原始对象

final int[] array = { 1, 2, 3, 1 };
Object proxy = Proxy.newProxyInstance(array.getClass().getClassLoader(), array.getClass().getInterfaces(), new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        StringBuilder b=new StringBuilder("the array is");
        for(int i:array)
            b.append(" ").append(i);
        return b.toString();
    }
});
System.out.println(proxy.toString());

上面的输出为“数组为1 2 3 1”。

您不能更改数组的任何功能。指定数组的每个成员:

数组类型的成员包括以下所有成员:

  • public
    final
    字段
    length
    ,其中包含数组的组件数。
    length
    可以是正的,也可以是零

  • public
    方法
    clone
    ,该方法重写类
    对象中同名的方法,并且不抛出任何选中的异常。数组类型
    T[]
    clone
    方法的返回类型为
    T[]

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

  • 从类
    对象
    继承的所有成员;
    对象
    唯一未继承的方法是其
    克隆
    方法

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

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

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

快速浏览OpenJDK 8源代码可以找到一些与阵列相关的机制:

  • –为解释器执行字节码指令,包括创建和访问数组的指令。然而,这是一个复杂的过程

  • –从字节码编译为本机代码时,执行一些巧妙的数组边界检查消除

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



如果要自定义数组的行为,唯一可以做的事情不是直接使用数组,而是使用、子类或写入内部包含数组的集合类。这使您可以完全自由地定义类的行为和性能特征。但是,不可能将自定义类设为arr在Java语言的意义上是。这意味着你不能让它实现
[]
运算符,或者可以使用一个需要数组的方法。

考虑查看JDK中的类是如何实现的。我找不到我想读的部分。你能帮我一下吗?它分布在jvm.cpp文件中的各个地方:-这里还有一些位:为了它,你认为你为什么要读它现在说说这个?定义自己的“数组”有什么意义?当周围有很多集合类时?构建自己的“数组类型”有什么实际价值?我想了解它是如何创建的。数组类与其他java类完全不同。我想了解原因。我认为这个类是由本机方法创建的,它没有构造函数和其他java类