【问题标题】:IllegalAccessError and proxyIllegalAccessError 和代理
【发布时间】:2010-04-07 05:49:23
【问题描述】:

我正在将this code 翻译成 Clojure。如您所见,我必须扩展类ArthurFrame,但每次使用(proxy [ArthurFrame] [] ...) 时都会得到IllegalAccessError

知道为什么吗?这是class's source

谢谢!

编辑: Here is the full error stack 在 REPL 上运行 (proxy [ArthurFrame] [])。

编辑 2:实际上,即使实例化类似乎也会产生错误。这是(ArthurFrame. wid) 的输出:

试图从类 user$eval__2205 访问类 com.trolltech.demos.ArthurFrame [抛出的类 java.lang.IllegalAccessError] 重启: 0:[ABORT] 返回 SLIME 的顶层。 回溯: 0: 用户$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: 用户$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)

【问题讨论】:

  • 能否请您提供完整的异常堆栈跟踪?
  • 能否请您在问题中包含代码而不是链接到代码。链接中断。

标签: java clojure


【解决方案1】:

问题在于 ArthurFrame 可见性是包不公开的,因此代理无法访问它,因为代理不属于包 com.trolltech.demos。您必须公开 ArthurFrame。

【讨论】:

  • 生活和学习...我以为默认行为是公开!
【解决方案2】:

问题的最可能原因是某些内容尚未重新编译。这是IllegalAccessError 异常的javadoc 描述:

如果应用程序尝试访问或修改字段,或调用它无权访问的方法,则抛出此异常。

通常,编译器会捕获此错误;如果类的定义发生了不兼容的更改,则此错误只会在运行时发生。

更具体地说,这通常发生在您有 AB 的类时,其中 B 依赖于 A 的某些成员。然后你做这样的事情:

  1. 你编译A,然后编译B

  2. A 进行不兼容的更改并重新编译它而不重新编译B。在这种情况下,更改将涉及降低 B 使用的 A 的某些成员的可见性,以便该成员不再对 B 可见。

  3. 运行使用AB 的应用程序,您将获得IllegalAccessError

编辑

试图进行访问的代理类看起来一定是由 Clojure 编译器生成的。因此,可能存在 Clojure 编译器错误……或者您在运行 Clojure 编译器后更改了 ArthurFrame 的可见性。无论哪种方式,一种可能的解决方法是将ArthurFrame 的可见性更改为public

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2021-05-08
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多