我正在将this code翻译成Clojure。正如您所看到的,我必须扩展课程ArthurFrame
,但每次使用IllegalAccessError
时我都会获得(proxy [ArthurFrame] [] ...)
。
知道为什么吗?这是class's source。
谢谢!
编辑: Here is the full error stack在REPL上运行(proxy [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)
答案 0 :(得分:6)
问题是ArthurFrame可见性是包不公开所以代理无法访问它,因为代理不属于com.trolltech.demos包。你必须公开ArthurFrame。
答案 1 :(得分:1)
问题的最可能原因是某些内容尚未重新编译。这是IllegalAccessError
例外的javadoc描述:
如果应用程序试图访问或修改字段,或调用它无权访问的方法,则抛出该文件。
通常,编译器会捕获此错误;如果类的定义发生不兼容的更改,则此错误只能在运行时发生。
更具体地说,这通常发生在您有A
和B
课程时,其中B
取决于A
的某些成员。然后你做这样的事情:
您编译A
,然后编译B
。
对A
进行不兼容的更改,并在不重新编译B
的情况下重新编译。在这种情况下,更改将涉及降低A
使用的B
某些成员的可见性,以便B
不再显示该成员。
运行使用A
和B
的应用,您将获得IllegalAccessError
。
修改强>
尝试进行访问的代理类看起来必须由Clojure编译器生成。所以可能有一个Clojure编译器错误......或者你在运行Clojure编译器后改变了ArthurFrame
的可见性。无论哪种方式,一种可能的解决方法是将ArthurFrame
的可见性更改为public
。