2009-10-02 11 views
12

Tengo un jar cargado en mi classpath (en iReport si es importante) que estoy seguro tiene el método deseado aún cuando trato de probar la conexión, llamando al jar, obtengo un java.lang.NoSuchMethodError, diciendo que se hace referencia a la clase¿Por qué se agrega una "L" a mi ruta de Java?

Lorg/springframework/web/context/WebApplicationContext 

no estoy seguro de si esto está relacionado con el problema o no, pero ¿de dónde la 'L' al principio viene? Otra vez que estaba haciendo referencia a una clase, había una "V" después de la clase. ¿De dónde vienen estas cartas y qué significan?

inicio de la traza de la pila:

java.lang.NoSuchMethodError: 
org.springframework.web.context.ContextLoader 
.getCurrentWebApplicationContext()Lorg/springframework/web/context/WebApplicationContext; 

Respuesta

24

Estas cartas son utilizados por Java para codificar la firma del método internamente. Por ejemplo, una "L" anuncia un siguiente "Objeto", que se especifica por su nombre de clase completo y seguido por un punto y coma. La "V" debería haber sido precedida por paréntesis y describe un tipo de retorno de "vacío".

Tome su ejemplo:

java.lang.NoSuchMethodError:
org.springframework.web.context.ContextLoader .getCurrentWebApplicationContext()Lorg/springframework/web/context/WebApplicationContext;

Se dice, que no hay un método en la clase org.springframework.web.context.ContextLoader llamada getCurrentWebApplicationContext que no acepta argumentos [denotados por ()] y devuelve un objeto (anunciado por L) llamada `org/springframework/web/context/WebApplicationContext (cerrado por ';').

EDIT: La lista de todos los códigos está en la Tabla 3.2 del JNI specs.

EDIT2: Aún más autoritario: la sección 4.3 Descriptors de la especificación JVM contiene una referencia completa del formato y los códigos.

+2

¿Hay una buena referencia para los códigos de letras? Iba a publicar esencialmente la misma respuesta, pero no quería hacer declaraciones sin fundamento. –

+0

Ah, esa es una buena referencia. –

8

El carácter L se utiliza para indicar un nombre de clase en la especificación de clase interna de Java.

Consulte el Java VM spec para más detalles.

Y un table de los tipos de campos:

BaseType 
B  byte (signed byte) 
C  char (Unicode character) 
D  double (double-precision floating-point value) 
F  float (single-precision floating-point value) 
I  int (integer) 
J  long (long integer) 
L<classname>;  reference (an instance of class <classname>) 
S  short (signed short) 
Z  boolean (true or false) 
[  reference (one array dimension) 
+0

También encontré que: P - proyecto F - carpeta – Seagull

Cuestiones relacionadas