[英]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.