簡體   English   中英

java中運行時執行的過程是怎樣的,JVM在運行時是如何檢查數組類型的?

[英]What is the process of runtime execution in java and how does JVM checks for array types at run time?

我正在閱讀泛型和類型安全,發現數組在 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 遵循的預定義過程?

2)在什么時候引發了這個異常? 我認為 ArrayStoreException 只有在我嘗試讀取數組時才會發生,但我錯了。 所以我不明白這個錯誤究竟是在什么時候引發的。

此外,需要對 Java 程序執行過程進行一些說明。 運行時錯誤和異常是否只是在程序執行時發生的錯誤,即 JVM 已開始解釋和執行指令,或者字節碼驗證期間的錯誤也被視為運行時錯誤。

我的問題是 JVM 如何在運行時檢查數組類型?

JVM 在解釋字節碼時,解釋器在解釋aastore字節碼指令時會執行相關的運行時類型檢查。 相關的 JVM 規范鏈接是https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.aastore

JIT 編譯器會將aastore指令翻譯成執行相同操作的本機代碼,盡管它可能會優化掉任何它可以確定為冗余的類型檢查。

請注意,如果您調整字節碼以嘗試將引用分配到原始類型的數組中,這種事情只會引起驗證者的注意。

這個異常是在什么時候引發的?

當您將一個值分配給某個引用類型的數組時,並且您分配的值與該數組的基類型不兼容

(請注意,對於原始類型的數組,不會拋出異常。如果您嘗試將long分配給int[]或將boolean分配給int[]您將收到編譯錯誤。如果您嘗試分配一個int變成long[]值將被加寬。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM