IllegalAccessError и прокси - PullRequest
       26

IllegalAccessError и прокси

2 голосов
/ 07 апреля 2010

Я перевожу этот код на Clojure. Как видите, мне нужно расширить класс ArthurFrame, но я получаю IllegalAccessError каждый раз, когда использую (proxy [ArthurFrame] [] ...).

Есть идеи почему? Вот источник класса .

Спасибо!

РЕДАКТИРОВАТЬ: Вот полный стек ошибок для запуска (прокси [ArthurFrame] []) на REPL.

EDIT 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)

Ответы [ 2 ]

6 голосов
/ 07 апреля 2010

Проблема в том, что видимость ArthurFrame не является общедоступной, поэтому прокси не может получить к ней доступ, поскольку прокси не принадлежит пакету com.trolltech.demos.Вы должны сделать ArthurFrame публичным.

1 голос
/ 07 апреля 2010

Наиболее вероятной причиной вашей проблемы является то, что что-то не было перекомпилировано. Вот описание javadoc исключения IllegalAccessError:

Брошенный, если приложение пытается получить доступ или изменить поле, или вызвать метод, к которому у него нет доступа.

Обычно эта ошибка отлавливается компилятором; эта ошибка может возникнуть только во время выполнения, если определение класса несовместимо изменилось.

Точнее говоря, обычно это происходит, когда у вас есть классы A и B, где B зависит от некоторых членов A. Затем вы делаете что-то вроде этого:

  1. Вы компилируете A, затем B.

  2. Внести несовместимое изменение в A и перекомпилировать без перекомпиляции B. В этом случае изменение будет включать уменьшение видимости некоторого элемента A, который используется B, так что элемент больше не будет виден B.

  3. Запустите приложение, которое использует A и B, и вы получите IllegalAccessError.

EDIT

Прокси-класс, который пытается осуществить доступ, похоже, был сгенерирован компилятором Clojure. Так что, возможно, есть ошибка компилятора Clojure ... или, возможно, вы изменили видимость ArthurFrame после запуска компилятора Clojure. В любом случае, одним из возможных исправлений является изменение видимости ArthurFrame на public.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...