2011-03-25 120 views

回答

3

resolve參數控制所加載的類是否被鏈接。在鏈接期間,靜態常量被初始化並分配內存。此外,該類是驗證的正確性,並可能鏈接到其他類將得到解決。

例如,如果您希望加載可能格式錯誤的新類,並且不希望JVM在類錯誤的情況下拋出驗證錯誤,這可能很有用。

1

該類在第一次使用時(或至少是使用過的部分)無論如何都被鏈接 - 使用resolve標誌可以使VM立即而不是稍後執行此鏈接(並拋出相關錯誤)。

1

您可以試試。

public class Test3 { 

    static{ 
     new Test(); 
    } 
} 

編譯之後,測試類從具體類的interface.but改變仍然Test3的鏈接到一個具體的類Test.Then如果決心是假的,JVM會找不到這個error.It的很有意思。實際上,Class someClass1= Class.forName("Test3",false,cls)也不會解析Test3,這意味着不會拋出錯誤。

但是,如果您在subClass或Class.forName("Test3")中設置resolve爲true,那麼運行時中的JVM將查找類鏈接錯誤。

供您參考,Java語言規範 - 12.3 Linking of Classes and Interfaces解釋resolveClass做什麼。類和接口的

12.3 鏈接 鏈接是採取一個類或接口類型的二進制形式並將其組合成Java虛擬機的運行時狀態,以便它可以被執行的處理。類或接口類型始終在鏈接之前加載。鏈接中涉及三種不同的活動:符號引用的驗證,準備和解析。鏈接的精確語義在Java虛擬機規範第二版的第5章中給出。這裏我們從Java編程語言的角度給出一個過程的概述。

12.3.3符號引用分辨率 一個類或接口的引用其它類和接口和它們的字段,方法和構造象徵性的二進制表示,使用其它的類和接口的二進制名稱(§13.1) (§13.1)。對於字段和方法,這些符號引用包括聲明字段或方法的類或接口類型的名稱,以及字段或方法本身的名稱以及適當的類型信息。 在使用符號引用之前,它必須經過解析,其中符號引用被檢查爲正確的,並且通常用直接引用替代,如果引用被重複使用,則可以更有效地處理符號引用。

如果在解析過程中發生錯誤,則會拋出錯誤。通常,這將是類IncompatibleClassChangeError的以下子類之一的實例,但它也可能是IncompatibleClassChangeError的某個其他子類的實例,或者甚至是類IncompatibleClassChangeError本身的一個實例。此錯誤可能在使用的符號參照的類型的程序的任何點被拋出,直接或間接地:

IllegalAccessError:一個符號引用已經遇到一個指定字段的使用或分配,或調用或者創建一個類的實例,由於該字段或方法被聲明爲私有的,受保護的或默認訪問權限(不是公共的),或者因爲該類未聲明,因此包含該引用的代碼無法訪問該類的實例上市。 例如,如果在引用該字段的另一個類已編譯(第13.4.6節)之後,最初聲明爲public的字段被更改爲private,則會發生這種情況。

InstantiationError:在類實例創建表達式中遇到了符號引用,但實例無法創建,因爲引用指向接口或抽象類。 例如,如果在引用相關類的另一個類已編譯(第13.4.1節)之後,最初不是抽象的類會更改爲抽象類型,則可能發生這種情況。

NoSuchFieldError:遇到引用特定類或接口的特定字段的符號引用,但類或接口不包含該名稱的字段。 例如,如果在引用字段的另一個類被編譯(第13.4.7節)之後從類中刪除了一個字段聲明,則會發生這種情況。

NoSuchMethodError:遇到一個符號引用,它引用特定類或接口的特定方法,但類或接口不包含該簽名的方法。 例如,如果在引用方法的另一個類被編譯後(第13.4.11節)從類中刪除了方法聲明,則可能發生這種情況。 此外,如果一個類聲明瞭一個本機方法,但沒有找到任何實現,則可能拋出一個UnsatisfiedLinkError的一個子類LinkageError)。根據虛擬機正在使用哪種分辨率策略(§12.3),如果使用該方法或更早,則會發生錯誤。

相關問題