java.lang.IllegalAccessError: tentative d’access à la méthode

Je reçois une exception et je ne peux pas en trouver la raison.

L’exception que je reçois est:

java.lang.IllegalAccessError: tentative d’access à la méthode Connected.getData (Ljava / lang / Ssortingng;) Ljava / sql / ResultSet; de classe B

La méthode est publique.

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(Ssortingng 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; } 

J’utilise Apache Tomcat 5.5.12 et JAVA 1.6

Vous utilisez presque certainement une autre version de la classe à l’exécution que celle que vous attendez. En particulier, la classe d’exécution serait différente de celle sur laquelle vous avez compilé (sinon cela aurait provoqué une erreur de compilation) – cette méthode a-t-elle déjà été private ? Avez-vous d’anciennes versions des classes / jars sur votre système quelque part?

En tant que javadocs pour l’état IllegalAccessError ,

Normalement, cette erreur est interceptée par le compilateur; cette erreur ne peut se produire que lors de l’exécution si la définition d’une classe a été modifiée de manière incompatible.

Je regarderais bien votre chemin de classe et vérifierais s’il y a des sursockets.

Cela se produit lors de l’access à une méthode de paquetage d’une classe qui se trouve dans le même package mais qui se trouve dans un autre chargeur de classes et jar.

C’était ma source, mais le lien est maintenant cassé. Voici le texte intégral du cache Google:

Les packages (comme dans l’access au package) sont définis par ClassLoader.

Vous indiquez que le ClassLoader parent charge l’interface et que le ClassLoader enfant charge l’implémentation. Cela ne fonctionnera pas en raison de la nature spécifique à la classe de chargement du package. L’interface n’est pas visible pour la classe d’implémentation car, même si c’est le même nom de package, ils se trouvent dans différents ClassLoaders.

Je n’ai écrémé que les messages de ce sujet, mais je pense que vous avez déjà découvert que cela fonctionnera si vous déclarez que l’interface est publique. Cela fonctionnerait également pour avoir à la fois l’interface et l’implémentation chargées par le même ClassLoader.

En réalité, si vous vous attendez à ce que des gens arbitraires implémentent l’interface (ce que vous faites apparemment si l’implémentation est en cours de chargement par un autre ClassLoader), alors vous devriez rendre l’interface publique.

ClassLoader-scoping de la scope du package (qui s’applique à l’access aux méthodes de package, aux variables, etc.) est similaire à la scope de classe ClassLoader générale. Par exemple, je peux définir deux classes, toutes deux nommées com.foo.Bar, avec un code d’implémentation complètement différent si je les définis dans des ClassLoaders distincts.

Joel

Si getData est protégé, essayez de le rendre public. Le problème pourrait exister dans JAVA 1.6 et être absent dans 1.5x

J’ai ça pour ton problème. Erreur d’access illicite

Cela m’est arrivé lorsque j’avais une classe dans un pot essayant d’accéder à une méthode privée dans une classe d’un autre pot. J’ai simplement changé la méthode privée en public, recompilé et déployé, et cela fonctionnait bien après.

Je @RestController ApplicationInfoResource cette erreur sur une application Spring Boot où un @RestController ApplicationInfoResource avait une classe nestede ApplicationInfo .

Il semble que Spring Boot Dev Tools utilisait un chargeur de classe différent.

L’exception que je devais

2017-05-01 17: 47: 39.588 WARN 1516 — [nio-8080-exec-9] .mmaExceptionHandlerExceptionResolver: Exception résolue causée par l’exécution du gestionnaire: org.springframework.web.util.NestedServletException: Échec de la répartition du gestionnaire; l’exception nestede est java.lang.IllegalAccessError: tentative d’access à la classe com.gt.web.rest.ApplicationInfo de la classe com.gt.web.rest.ApplicationInfoResource $$ EnhancerBySpringCGLIB $$ 59ce500c

Solution

J’ai déplacé la classe nestede ApplicationInfo dans un fichier .java distinct et éliminé le problème.

Du sharepoint vue Android: Méthode non disponible dans la version api

Je recevais ce problème principalement parce que j’utilisais quelque chose qui n’est pas disponible / obsolète dans cette version Android

Fausse route:

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

La bonne façon:

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

ici Notification.Action n’est pas disponible avant API 20 et ma version min était API 16

Juste un ajout à la réponse résolue:

Cela pourrait poser un problème avec la fonction d’exécution instantanée d’Android Studio, par exemple, si vous réalisiez que vous avez oublié d’append la ligne de code: finish() à votre activité après en avoir ouvert une autre et que vous avez déjà rouvert l’activité ont rouvert (ce que finish() résolu), puis vous ajoutez finish() et Instant Run se produit, puis l’application va planter car la logique a été cassée.


TL: DR;

Ce n’est pas nécessairement un problème de code, juste un problème d’exécution instantanée

Dans mon cas, le problème était qu’une méthode était définie par default dans une interface A , tandis que sa sous-classe la remplaçait comme privée. Ensuite, lors de l’appel de la méthode, le java Runtime s’est rendu compte qu’il appelait une méthode privée.

Je suis toujours perplexe quant à la raison pour laquelle le compilateur ne s’est pas plaint de la dérogation privée.

 public interface A { default void doStuff() { // doing stuff } } public class B { private void doStuff() { // do other stuff instead } } public static final main(Ssortingng... args) { A someB = new B(); someB.doStuff(); }