2012-06-16 10 views
5

Como sabemos, en Java, el nombre del método no es suficiente para distinguir diferentes métodos.¿Cuál es la identificación interna de un método Java?

creo (que puede estar mal), para distinguir un método, se necesita la siguiente información:

(className, methodName, methodParameters) 

Además,

  • cómo identificar un método más eficiente internamente?
  • Oí hablar de "ID de método". ¿Significa que hay un mapeo entre el triple anterior y un entero, por lo que JVM usa solo el ID del método después del análisis?
  • Si es así, ¿reside en la tabla de símbolos?

Gracias!

+1

Su pregunta es demasiado vaga. ¿Estás hablando de identificar el método en el compilador? En el archivo ".class"? En el programa de ejecución? –

Respuesta

0

Java siempre distingue sus elementos de idioma por sus nombres completos.

Suponga que tiene un método en la clase myMethod(int a, int b)MyClass que se encuentra en el paquete java com.mypackage continuación identificará el método con el nombre com.mypackage.MyClass.myMethod(int a , int b).

Solo para darle más información, también tiene en cuenta la cargadora de clases cuando hay una necesidad de resolver dos elementos idénticos.

Considera, qué cargador de clases se utilizó para cargar la clase particular que contiene el método al que se refiere. Hay cuatro tipos de cargadores de clase en Java. Puede leer la documentación de la clase java.lang.Thread para esto.

+1

¿Qué quiere decir con "Hay cuatro tipos de cargadores de clase en Java"? –

+0

Una clase que se carga por la JVM puede ser cargado por cualquiera de los siguientes cuatro cargadores de clases: 1) cargador de clases Bootstrap 2) Clase de Extensión loader 3) clase System loader 4) Clase de aplicación loader Por favor, vea ellos tienen su propio significado. Para más detalles, consulte el siguiente enlace. http://javapapers.com/core-java/java-class-loader/ – dharam

+0

Ah bien. (4) no está delimitado de la misma manera que los otros, y los tres primeros solo se distinguen por las convenciones de propiedad del sistema para especificar rutas de búsqueda. ¿Qué tiene esto que ver con los hilos o la búsqueda de métodos? El método se basa en la clase, por lo que depende del cargador de clases indirectamente, pero ¿cómo se menciona una taxonomía de los cargadores de clases para abordar la pregunta original? –

1

que no entiendo muy bien lo que está tratando de hacer, pero creo que hay algunas respuestas posibles, no obstante:

  • usted puede estar interesado en el JNI Method Descriptors, uno de los diversos string formats utilizados internamente por el JVM (y por las bibliotecas JNI) para identificar elementos de Java.

  • Es difícil saber de lo que está hablando. El "ID de método" puede ser una referencia para un objeto java.lang.reflect.Method, o puede ser el descriptor de método mencionado a continuación, o cualquier otra cosa. ¿Dónde lo leíste?

  • Dudo que exista tal tabla dentro de la JVM. Quiero decir, dudo que exista una tabla global , porque casi siempre recuperas un métodode una clase, incluso cuando se trata de una JVM, por lo que es razonable creer que el método está almacenado en la clase.Es likewhen utilizamos la reflexión para recuperar un método:

    Class clazz = String.class; 
    Method method = clazz.getDeclaredMethod("charAt", Integer.TYPE); 
    System.out.println(method.getName()); 
    

Nota que pido la clase String para el método, en lugar de pedir alguna clase util para darme el método charAt, que recibe una int y es de la clase String.

En otras palabras, su tupla de identificación es casi correcta - que simplemente no tiene una clase:

(methodName, methodParameters) 

y, en lugar de recuperar el método de la JVM pasando la clase y luego el nombre del método y luego los tipos de parámetros, recupera el método directamente de la clase, dando a la clase el nombre del método y los tipos de parámetros. Una diferencia sutil, seguro, pero creo que es por lo que te estás preguntando.

Esto es evidente incluso en los descriptores de JNI que mencioné a continuación. Por ejemplo, el método

long f(int i, Class c); 

está representado por la siguiente descriptor:

"(ILjava/lang/Class;)J" 

Note que no hay ninguna referencia a la clase del método.

El excellent documentation on the class file format (ya señalado por @Lawence) puede proporcionarle algunas ideas. Te recomiendo que lo leas completamente.

+0

"Dudo que exista tal tabla dentro de la JVM". Una JVM podría definir dicha tabla para uso interno, pero hacerlo podría complicar la recolección de basura de los cargadores de clases. –

0

1) ¿Cómo identificar un método de manera más eficiente internamente?

Internamente a qué? Hay muchos lugares donde un método podría necesitar ser "identificado" "internamente". En el compilador de códigos de bytes, el compilador JIT, el cargador de clases/enlazador, la representación del archivo de clase, la API de reflexión, un depurador, etc. Cada uno tiene diferentes preocupaciones de eficiencia.

2) Oí hablar de "ID de método". ¿Significa que hay un mapeo entre el triple anterior y un entero, por lo que JVM usa solo el ID del método después del análisis?

Un ID de método se utiliza en la representación del archivo de clase, y podría ser utilizado por cualquier cosa basada en eso, incluido el cargador/enlazador de clases, el compilador JIT y el depurador.

La JVM no analiza el código Java.

3) Si es así, ¿reside en la tabla de símbolos?

Podría hacer. Depende de lo que quiere decir con "la tabla de símbolos". Tenga en cuenta que hay muchos lugares donde se requiere la identificación de métodos durante todo el ciclo de vida de una clase. Por ejemplo, las API de reflexión de Java requieren información del método para implementar métodos como getDeclaredMethod(...) y varios métodos de Method.

Cuestiones relacionadas