簡體   English   中英

java.lang.IllegalAccessError:嘗試從類Entity訪問字段ConcreteEntity.instance

[英]java.lang.IllegalAccessError: tried to access field ConcreteEntity.instance from class Entity

java.lang.IllegalAccessError:嘗試從類Entity訪問字段ConcreteEntity.instance

好的,這是交易。 我正在嘗試訪問ConcreteEntity.instance ,這是一個默認存在於默認ClassLoader的訪問類型default的字段,而Entity.getInstance是存在於子ClassLoader

現在請記住,它們都在同一個包中,但是拋出了IllegalAccessError 是否有一個解決這個問題的方法,不涉及我實際上將Entity類ClassLoaderConcreteEntity相同的ClassLoader中?

0 new #14 <Entity>
 3 dup
 4 aload_0
 5 invokevirtual #18 <Adapter.getInstance>
 8 checkcast #20 <sl>
11 getfield #24 <sl.d>
14 invokespecial #25 <Entity.<init>>
17 areturn

通過jclasslib at檢索的字節碼是“編譯后”生成的異常。

謝謝Gamb清理帖子。

查看類似問題的回答 ,除非您的情況很明顯,您正在處理多個類加載器:

jvm認為從不同的類加載器加載的類在不同的“運行時包”中,即使它們具有相同的包名。 引用jvm spceification ,第5.3節:

在運行時,類或接口不是由其名稱單獨確定,而是由一對確定:它的完全限定名稱及其定義的類加載器。 每個這樣的類或接口都屬於單個運行時包 類或接口的運行時包由包名稱和類或接口的類加載器定義。

在5.4.4節中:

當且僅當滿足以下任一條件時,才能訪問類或接口D的字段或方法R.

...

R既可以是受保護的,也可以是包私有的(既不是公共的也不是受保護的,也不是私有的),並且由與D相同的運行時包中的類聲明。

Javadoc:通常,編譯器會捕獲此錯誤; 如果類的定義發生了不兼容的更改,則此錯誤只能在運行時發生。

因為我認為嘗試了一些困難的類操作,可能是類加載,在兩個類的加載方式上投入一些時間。 (在極少數情況下,顯式的serialVersionId可能有所幫助。)

如果類是相關的(超級/子類),則嘗試使用接口刪除該關系。 可能使用注射。 那不是兩次引用/加載一個類。

對不起,我不能給出具體的答案。

暫無
暫無

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

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