[英]IllegalAccessError and proxy
我正在將此代碼翻譯為Clojure。 如您所見,我必須擴展ArthurFrame
類,但是每次使用時都會收到一個IllegalAccessError
(proxy [ArthurFrame] [] ...)
。
知道為什么嗎? 這是班級的來歷 。
謝謝!
編輯: 這是在REPL上運行(代理[ArthurFrame] []) 的完整錯誤堆棧 。
編輯2 :實際上似乎即使實例化該類也會產生錯誤。 這是(ArthurFrame. wid)
的輸出:
tried to access class com.trolltech.demos.ArthurFrame from class user$eval__2205 [Thrown class java.lang.IllegalAccessError] Restarts: 0: [ABORT] Return to SLIME's top level. Backtrace: 0: user$eval__2205.invoke(NO_SOURCE_FILE:1) 1: clojure.lang.Compiler.eval(Compiler.java:4642) 2: clojure.core$eval__5254.invoke(core.clj:2031) 3: swank.commands.basic$eval_region__907.invoke(basic.clj:40) 4: swank.commands.basic$eval_region__907.invoke(basic.clj:31) 5: swank.commands.basic$eval__927$listener_eval__929.invoke(basic.clj:54) 6: clojure.lang.Var.invoke(Var.java:359) 7: user$eval__2202.invoke(NO_SOURCE_FILE) 8: clojure.lang.Compiler.eval(Compiler.java:4642) 9: clojure.core$eval__5254.invoke(core.clj:2031) 10: swank.core$eval_in_emacs_package__455.invoke(core.clj:59) 11: swank.core$eval_for_emacs__533.invoke(core.clj:128) 12: clojure.lang.Var.invoke(Var.java:367) 13: clojure.lang.AFn.applyToHelper(AFn.java:179) 14: clojure.lang.Var.applyTo(Var.java:476) 15: clojure.core$apply__4379.invoke(core.clj:434) 16: swank.core$eval_from_control__458.invoke(core.clj:66) 17: swank.core$eval_loop__461.invoke(core.clj:71) 18: swank.core$spawn_repl_thread__595$fn__627$fn__629.invoke(core.clj:183) 19: clojure.lang.AFn.applyToHelper(AFn.java:171) 20: clojure.lang.AFn.applyTo(AFn.java:164) 21: clojure.core$apply__4379.invoke(core.clj:434) 22: swank.core$spawn_repl_thread__595$fn__627.doInvoke(core.clj:180) 23: clojure.lang.RestFn.invoke(RestFn.java:402) 24: clojure.lang.AFn.run(AFn.java:37) 25: java.lang.Thread.run(Thread.java:619)
問題在於ArthurFrame可見性不是包公開的,因此代理無法訪問它,因為代理不屬於com.trolltech.demos包。 您必須將ArthurFrame公開。
造成問題的最可能原因是某些內容尚未重新編譯。 這是IllegalAccessError
異常的javadoc描述:
如果應用程序嘗試訪問或修改字段,或調用它無權訪問的方法,則拋出該異常。
通常,此錯誤由編譯器捕獲; 如果類的定義發生了不兼容的更改,則只有在運行時才會發生此錯誤。
更具體地說,這通常發生在您擁有類A
和B
,其中B
依賴於A
某些成員。 然后,您可以執行以下操作:
您先編譯A
,然后編譯B
對A
進行不兼容的更改,然后重新編譯而不重新編譯B
在這種情況下,更改將涉及降低B
使用的A
的某個成員的可見性,以使該成員不再對B
可見。
運行使用A
和B
的應用程序,您將收到IllegalAccessError
。
編輯
嘗試進行訪問的代理類看起來必須由Clojure編譯器生成。 因此,可能存在Clojure編譯器錯誤...或者運行了Clojure編譯器后,您更改了ArthurFrame
的可見性。 無論哪種方式,一種可能的解決方法是將ArthurFrame
的可見性更改為public
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.