簡體   English   中英

IllegalAccessError和代理

[英]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描述:

如果應用程序嘗試訪問或修改字段,或調用它無權訪問的方法,則拋出該異常。

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

更具體地說,這通常發生在您擁有類AB ,其中B依賴於A某些成員。 然后,您可以執行以下操作:

  1. 您先編譯A ,然后編譯B

  2. A進行不兼容的更改,然后重新編譯而不重新編譯B 在這種情況下,更改將涉及降低B使用的A的某個成員的可見性,以使該成員不再對B可見。

  3. 運行使用AB的應用程序,您將收到IllegalAccessError

編輯

嘗試進行訪問的代理類看起來必須由Clojure編譯器生成。 因此,可能存在Clojure編譯器錯誤...或者運行了Clojure編譯器后,您更改了ArthurFrame的可見性。 無論哪種方式,一種可能的解決方法是將ArthurFrame的可見性更改為public

暫無
暫無

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

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