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类