2011-08-16 10 views
51

Recibo una excepción y no puedo encontrar el motivo.java.lang.IllegalAccessError: intentado acceder al método

La excepción que recibo es:

java.lang.IllegalAccessError: tried to access method Connected.getData(Ljava/lang/String;)Ljava/sql/ResultSet; from class B

El método es público.

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

estoy usando Apache Tomcat 5.5.12 y JAVA 1.6

Respuesta

56

Usted está casi seguro que utiliza una versión diferente de la clase en tiempo de ejecución a la que usted espera. En particular, la clase de tiempo de ejecución sería diferente a la que compiló (de lo contrario, esto habría causado un error en tiempo de compilación): ¿ese método alguna vez ha sido private? ¿Tiene versiones antiguas de las clases/jarras en su sistema en cualquier lugar?

Como los javadocs para IllegalAccessError estado,

Normally, this error is caught by the compiler; this error can only occur at run time if the definition of a class has incompatibly changed.

sin duda me miro a la ruta de clases y comprobar si tiene sorpresas.

+3

@yossi: Entonces, ¿cómo lo resolvió? ¿Vuelva a compilar el soruce y póngalo en su classpath? Solo curiosidad si descompilaste la clase original y sabías lo que había en ella. – Victor

+0

Cuando tuve esto, había guardado el archivo con una función privada hecha pública y el editor vio todo bien en el archivo .jsp, pero no reinicié el programa principal, por lo que no había compilado el nuevo versión. –

+0

Recibo este error de un paquete maven recién instalado. He actualizado el proyecto y lo he limpiado pero todo parece cambiar. – softwareplay

5

Si getData está protegido, intente hacerlo público. El problema podría existir en JAVA 1.6 y estar ausente en 1.5x

Tengo esto para su problema. Illegal access error

75

Esto ocurre al acceder a un método de ámbito de paquete de una clase que está en el mismo paquete pero está en un jar y un cargador de clases diferentes.

This era mi fuente, pero el enlace ahora está roto. Lo que sigue es el texto completo de la caché de Google:

Packages (as in package access) are scoped per ClassLoader.

You state that the parent ClassLoader loads the interface and the child ClassLoader loads the implementation. This won't work because of the ClassLoader-specific nature of package scoping. The interface isn't visible to the implementation class because, even though it's the same package name, they're in different ClassLoaders.

I only skimmed the posts in this thread, but I think you've already discovered that this will work if you declare the interface to be public. It would also work to have both interface and implementation loaded by the same ClassLoader.

Really, if you expect arbitrary folks to implement the interface (which you apparently do if the implementation is being loaded by a different ClassLoader), then you should make the interface public.

The ClassLoader-scoping of package scope (which applies to accessing package methods, variables, etc.) is similar to the general ClassLoader-scoping of class names. For example, I can define two classes, both named com.foo.Bar, with entirely different implementation code if I define them in separate ClassLoaders.

Joel

+1

Tengo este problema en 'commons-collections-3.2.1.jar' en JBoss EAP 5.3 con Struts 1.1 porque este JAR ya está en el JBoss bibliotecas pero también estaba empaquetado en mis aplicaciones. Eliminé el JAR de mi aplicación, que resolvió el problema. –

+2

Me acabas de ahorrar MUCHO tiempo y valor. ¡Muy agradable! – msteiger

+0

Obtengo este error para un método público estático que ahora toma un segundo argumento. El archivo jar anterior ya no existe porque lo reemplacé. ¿Algunas ideas? – Markus

1

Esto me sucedió cuando tuve una clase en un frasco de intentar acceder a un método privado en una clase de otro frasco. Simplemente cambié el método privado a público, recompilado e implementado, y funcionó bien después.

0

Desde la perspectiva Android: método no está disponible en la versión de la API

que estaba recibiendo este número sobre todo porque yo estaba usando algo que no está disponible/desaprobado en esa versión de Android

incorrecto manera:

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

manera correcta:

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

aquí Notificación.La acción no está disponible antes de la API 20 y mi versión min fue API 16

0

Sólo una adición a la respuesta resuelto:

Esto podría ser un problema con la función de ejecución instantánea de Android Studio, por ejemplo, si se dio cuenta de que olvidó agregar la línea de código: finish() a su actividad después de abrir otra, y ya volvió a abrir la actividad que no debió haber reabierto (que el finish() resuelto), luego agrega finish() e Instante Se ejecuta, entonces la aplicación se bloqueará ya que la lógica se ha roto.


TL: DR;

Esto no es necesariamente un problema de código, sólo un instante Ejecutar problema

2

que estaba recibiendo este error en una aplicación de inicio de primavera donde un @RestController ApplicationInfoResource tenían una clase anidada ApplicationInfo.

Parece que el Spring Boot Dev Tools usaba un cargador de clase diferente.

La excepción que estaba recibiendo

2017-05-01 17:47:39.588 WARN 1516 --- [nio-8080-exec-9] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.IllegalAccessError: tried to access class com.gt.web.rest.ApplicationInfo from class com.gt.web.rest.ApplicationInfoResource$$EnhancerBySpringCGLIB$$59ce500c

Solución

moví la clase anidada ApplicationInfo a un archivo .java separado y se deshizo del problema.

Cuestiones relacionadas