![](/img/trans.png)
[英]Spring error in Cucumber java.lang.IllegalAccessError: tried to access class
[英]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類ClassLoader
與ConcreteEntity
相同的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.