java.lang.IllegalAccessError: попытался получить доступ к методу - PullRequest
68 голосов
/ 16 августа 2011

Я получаю исключение и не могу найти причину.

Исключение, которое я получаю:

java.lang.IllegalAccessError: попытался получить доступ к методу Connected.getData (Ljava / lang / String;) Ljava / sql / ResultSet; из класса B

Метод публичный.

public class B
{
  public void myMethod()
  {
   Connected conn = new Connected();  // create a connected class in order to connect to The DB 
   ResultSet rs = null;  // create a result set to get the query result
   rs = conn.getData(sql); // do sql query
  }
}

public class Connected 
{
 public ResultSet getData(String sql) 
{
  ResultSet rs = null;
  try 
  {
     prepareConnection();
     stmt = conn.createStatement();
     stmt.execute(sql);
     rs = stmt.getResultSet();
  }
  catch (SQLException E) 
      {
    System.out.println("Content.getData Error");
    E.printStackTrace();
       }
return rs;
}

Я использую Apache Tomcat 5.5.12. и JAVA 1.6

Ответы [ 8 ]

93 голосов
/ 10 мая 2012

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

Этот был моим источником, но ссылка теперь не работает. Ниже приводится полный текст из кэша Google:

Пакеты (как при доступе к пакетам) ограничены для ClassLoader.

Вы утверждаете, что родительский ClassLoader загружает интерфейс, а дочерний ClassLoader загружает реализацию. Это не будет работать из-за ClassLoader-специфичный характер определения объема пакета. Интерфейс не виден класс реализации, потому что, хотя это то же имя пакета, они находятся в разных загрузчиках классов.

Я только просмотрел сообщения в этой теме, но я думаю, что вы уже обнаружили что это будет работать, если вы объявите интерфейс общедоступным. Это также работать, чтобы интерфейс и реализация загружались одним и тем же ClassLoader.

Действительно, если вы ожидаете, что произвольные люди будут реализовывать интерфейс (который вы очевидно делать, если реализация загружается другим ClassLoader), тогда вы должны сделать интерфейс общедоступным.

ClassLoader-scoping области пакета (который относится к доступу к пакету методы, переменные и т. д.) аналогична общей области видимости ClassLoader имена классов. Например, я могу определить два класса, оба с именем com.foo.Bar, с совершенно другим кодом реализации, если я определю их в отдельном Загрузчиков классов.

Joel

71 голосов
/ 16 августа 2011

Вы почти наверняка используете версию класса, отличную от ожидаемой.В частности, класс времени выполнения будет отличаться от класса, с которым вы скомпилировали (иначе это вызвало бы ошибку времени компиляции) - был ли этот метод когда-либо равен private?У вас есть где-нибудь старые версии классов / jars в вашей системе?

В качестве javadocs для состояния IllegalAccessError,

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

Я бы определенно посмотрел на ваш путь к классу и проверил, нет ли в нем сюрпризов.

4 голосов
/ 16 августа 2011

Если getData защищено, попробуйте сделать его публичным. Проблема может существовать в JAVA 1.6 и отсутствовать в 1.5x

Я понял это для твоей проблемы. Ошибка незаконного доступа

3 голосов
/ 01 мая 2017

Я получал эту ошибку в приложении Spring Boot, где @RestController ApplicationInfoResource имел вложенный класс ApplicationInfo.

Кажется, Spring Boot Dev Tools использовал другой загрузчик классов.

Исключение, которое я получаю

2017-05-01 17: 47: 39.588 ПРЕДУПРЕЖДЕНИЕ 1516 --- [nio-8080-exec-9] .m.m.a.ExceptionHandlerExceptionResolver: устранено исключение, вызванное по исполнению обработчика: org.springframework.web.util.NestedServletException: отправка обработчика не удалось; Вложенное исключение - java.lang.IllegalAccessError: попытался доступ к классу com.gt.web.rest.ApplicationInfo из класса com.gt.web.rest.ApplicationInfoResource $$ EnhancerBySpringCGLIB $$ 59ce500c

Решение

Я переместил вложенный класс ApplicationInfo в отдельный файл .java и избавился от проблемы.

3 голосов
/ 28 июня 2016

Это случилось со мной, когда у меня был класс в одной банке, пытающийся получить доступ к закрытому методу в классе из другой банки.Я просто изменил приватный метод на public, перекомпилировал и развернул, и после этого он работал нормально.

0 голосов
/ 21 марта 2018

В моем случае проблема заключалась в том, что метод был определен в каком-то интерфейсе A как default, а его подкласс переопределил его как закрытый. Затем, когда метод был вызван, среда выполнения Java обнаружила, что вызывает частный метод.

Я все еще озадачен, почему компилятор не жаловался на приватное переопределение ..

public interface A {
     default void doStuff() {
         // doing stuff
     }
}

public class B {
     private void doStuff() {
         // do other stuff instead
     }
}

public static final main(String... args) {
    A someB = new B();
    someB.doStuff();
}
0 голосов
/ 15 июля 2016

Просто дополнение к решенному ответу:

Это МОЖЕТ быть проблемой с функцией мгновенного запуска Android Studio, например, если вы поняли, что забыли добавить строку кода:finish() к вашей активности после открытия другой, и вы уже повторно открыли операцию, которую не должны были повторно открывать (которую решило finish()), затем вы добавляете finish(), и происходит мгновенный запуск, затем приложение вылетаеттак как логика была нарушена.


TL: DR;

Это не обязательно проблема кода, просто проблема мгновенного запуска

0 голосов
/ 07 июля 2016

С точки зрения Android: Метод недоступен в API-версии

Эта проблема возникла в основном из-за того, что я использовал кое-что, что недоступно / устарело вэта версия Android

Неправильный путь:

Notification.Builder nBuilder = new Notification.Builder(mContext);
nBuilder.addAction(new Notification.Action(android.R.drawable.ic_menu_view,"PAUSE",pendingIntent));

Правильный путь:

Notification.Builder nBuilder = new Notification.Builder(mContext);
nBuilder.addAction(android.R.drawable.ic_media_pause,"PAUSE",pendingIntent);

здесь Уведомление. Действие недоступно до API 20 и моя минимальная версия была API 16

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