一千萬個為什麽

搜索

字節碼和對象

我正在研究字節碼檢測項目。目前,在處理對象時,驗證程序在大多數情況下都會拋出錯誤。所以我想清楚地了解有關對象的規則(我讀了JVMS但找不到我想要的答案):

我正在制定新指令:

原始字節碼

NEW 
DUP
INVOKESPECIAL >

儀表後

NEW 
DUP
INVOKESTATIC 
DUP
INVOKESPECIAL >

請註意,我添加了對Profiler.handleNEW()的調用,該調用將參數作為參數(新創建的對象)。

上面的代碼拋出VerificationError。如果我不添加INVOKESTATIC(只留下DUP),它就不會。那麽我違反的規則是什麽?我可以復制一個未初始化的引用,但我不能將其作為參數傳遞?我將不勝感激任何幫助。謝謝

最佳答案

JVM驗證程序處理一個尚未調用其構造函數的對象,就好像它具有一個名為“uninitialized”的特殊編譯時類型一樣。

因此,從驗證程序的角度來看,您將錯誤類型的對象作為第一個參數傳遞給 Profiler.handleNEW(),因為“未初始化”不被視為Object的子類(所以說話)。

關於如何定義“未初始化”的JVM規範的相關部分是這裏

轉載註明原文: 字節碼和對象