Exception in thread "main" java.lang.SecurityException: class "org.eclipse.swt.widgets.UFCComposite"'s signer information does not match signer information of other classes in the same package
什麼情況下可能出現該異常?
當使用者在自己的程式中定義了一個與系統內建的(如jdk,其它庫)同包的類時。
比如在自己的項目中定義了一個
java.lang包。在java.lang包下定義了某個類。載入該類或使用該類時,就會報出SecurityException異常。
相關概念:
父親委託機制的優點?
父親委託機制的優點是能夠提高軟體系統的安全性。因為在此機制下,使用者自訂的類載入器不可能載入應該由父載入器載入
的可靠類,從而防止不可靠甚至惡意的代碼代替由父載入器載入的可靠代碼。
例如,java.lang.Object類總是由根類載入器載入(BootStrap),其他任何使用者自訂的類載入器都不可能載入含有惡意代碼的
java.lang.Object類。
有幾個重要概念需要理解一下。(與安全有關)
1.命名空間
每個類載入器都有自己的命名空間,命名空間由載入器及所有父載入器所載入的類組成。
在同一個命名空間中,不會出現類的完整名字(包括類的包名)相同的兩個類;在不同的命名空間中,
有可能會出現類的完整名字(包括類的包名)相同的兩個類。
2.運行時包
由同一個類載入器載入的屬於相同包的類組成運行時包。決定兩個類是不是屬於同一個運行時包,不僅
要看它們的包名是否相同,還要看定義類載入器是否相同。只有屬於同一運行時包的類才能互相訪問可見(即預設存取層級)
的類和類成員。這樣的限制能避免使用者自訂的類冒充核心類庫的類,去訪問核心類庫的包可見成員。假設使用者自己定義了一個類
java.lang.Spy,並由使用者自訂的類載入器載入,由於jang.lang.Spy和核心類庫java.lang.*由不同的載入器載入,它們屬於不同的運行時包,所以java.lang.Spy不能訪問核心類庫java.lang包中的可見成員。