2008-12-10 10 views
10

veo esto en un seguimiento de pila:¿Qué significa esto en un seguimiento de pila?

myorg.vignettemodules.customregistration.NewsCategoryVAPDAO.getEmailContentByID (I) Lmyorg/pushemail/modelo/EmailContent;

¿Qué es la "(I)L"?

+0

El nombre de Java mangling está documentado en algún lugar del sitio de Sun. Alguien debería buscarlo y vincularlo desde la respuesta aceptada. –

+0

Solo he visto este nombre mangling usado con JNI; Obtuve mi información de http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html –

Respuesta

15

Se significa que el método tiene un int, y devuelve myorg.pushemail.model.EmailContent

La cadena de la "L" a ";" es un descriptor de tipo, para el tipo de devolución. Lo que está entre paréntesis son los parámetros del método (en este caso, solo hay uno).

Estas descripciones de tipo se definen como parte de la especificación de máquina virtual de Java, en section 4.3.2. Table 4.3-A muestra todos los códigos utilizados. Cuando se compila una clase, los descriptores de este formulario se utilizan para especificar la firma de los métodos y los tipos de campos y variables.

En la serialización de Java, los descriptores de métodos forman parte de la información que está codificada en hash en form the default serialVersionUID para una clase Serializable.

En RMI, los descriptores de método son hash, y el resultado se usa para identify which method is being invoked en la interfaz remota.

20

Es una forma de name mangling que se utiliza para la eliminación de sobrecargas de métodos. El nombre del método se agrega mediante una serie de caracteres que describen los parámetros y el tipo de retorno: los parámetros aparecen secuencialmente entre paréntesis, y el tipo de retorno sigue al paréntesis de cierre. Los códigos son los siguientes:

  • Z: boolean
  • B: byte
  • C: char
  • S: short
  • I: int
  • J: long
  • F: float
  • D: double
  • Ltotalmente calificado nombre-clase-;: clase completo
  • [tipo: array de tipo
  • V: void

Por lo tanto, en su caso, el (I)Lmyorg/pushemail/model/EmailContent; significa que el método toma un argumento del tipo int y devuelve un objeto del tipo myorg.pushemail.model.EmailContent.

0

Es un punto menor, pero no creo que se trate de cambiar de nombre. El cambio de nombre implica agregar cosas adicionales a un nombre. ZBC, etc. es la forma en que java codifica las firmas de métodos en los archivos de clase. En lugar de escribir boolean, ponen una Z. Ahorra espacio.

De acuerdo con la wikipedia (se aplica la exención de responsabilidad estándar), el único nombre que se traduce en Java implica clases internas y JNI.

+0

Esto debería ser un comentario sobre la respuesta de AdamRosenfield, no una respuesta en sí misma. – heenenee

0

Se dice, que no hay un método en la clase myorg.vignettemodules.customregistration.NewsCategoryVAPDAO llamada getEmailContentByID que acepte int argumentos [denotados por (i)] y devuelve un objeto (anunciado por L) denominado myorg/pushemail/model/EmailContent (cerrado por ';').

El carácter L e I se usa para indicar un nombre de clase y un número entero en la especificación de clase interna de Java.

Cuestiones relacionadas