Java中运行时执行的过程是什么?JVM如何在运行时检查数组类型?

iqih9akk  于 2022-11-07  发布在  Java
关注(0)|答案(1)|浏览(164)

我读了关于泛型和类型安全的书,发现数组在java中不能是泛型的。我也理解了数组的协变性质,这把我引向了数组存储异常。我理解了为什么会发生这种异常。
我尝试了下面的代码

class SuperClass {

}

class SubClass extends SuperClass {

}
public class ArrayCheck {

    public static void main (String args[]) {   
        SubClass arr[] = new SubClass[10];

        arr[0] = new SubClass();

        SuperClass[] arr1 = arr;
        arr1[1] = new SuperClass();

    }
}

这会产生一个预期的ArrayStoreException。
1.我的问题是JVM如何在运行时检查数组类型?编译器是否附加了任何额外的代码,或者JVM在执行指令之前是否遵循了一些预定义的过程?
1.这个异常是在什么时候引发的?我以为ArrayStoreException只会在我试图读取数组时发生,但我错了。所以我不明白这个错误是在什么时候引发的。
此外,还需要对Java程序的执行过程进行一些说明。
1.运行时错误和异常是指程序在执行过程中发生的错误,即JVM已开始解释和执行指令,或者字节码验证过程中发生的错误也被视为运行时错误。

3xiyfsfu

3xiyfsfu1#

我的问题是JVM如何在运行时检查数组类型?
当JVM解释字节码时,解释器在解释aastore字节码指令时执行相关的运行时类型检查。相关的JVM规范链接是https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.aastore。
JIT编译器会将aastore指令转换为执行相同操作的本机代码,尽管它可能会 * 优化掉 * 任何它可以确定为冗余的类型检查。
请注意,只有当您调整字节码以尝试将引用赋给基元类型的数组时,这种情况才会引起验证器的注意。
何时引发此异常?
当您将一个值赋给某个引用类型的数组,而您所赋的值与数组的基类型不 * 赋值兼容 * 时。
(Note如果您尝试将long赋给int[]或将boolean赋给int[],则会出现编译错误。如果您尝试将int赋给long[],则该值会变宽。)

相关问题