2011-12-01 7 views
6

Ahora me estoy enfocando en un proyecto que requiere una visión del código de bytes de Java.¿Cómo identificar el método de anulación en el código de bytes Java?

Con la ayuda de bcel, ahora puedo completar la mayor parte del trabajo. Un punto que ahora no tengo claro es cómo identificar un método de subclase que anule su código base. ¿Hay algún atributo registrado en el archivo .class asociado con un método que indique que esta relación de anulación o si debo ir hacia atrás a su clase base puedo comparar las firmas de método?

Cualquier sugerencia será muy apreciada.

Respuesta

5

Necesita buscar la cadena de la jerarquía: no hay nada en el código de bytes que indique que se trata de un método reemplazado, porque no es necesario.

+0

¿Por qué no es necesario? Entonces, ¿cómo JVM vincula dinámicamente un archivo '.class' diferente? ¿Busca la jerarquía inherente de abajo arriba, hasta que encuentra un método que coincida? Gracias. –

+1

@Summer_More_More_Tea Da la vuelta a la pregunta: ¿por qué * sería * necesario? Si se trata de un método de la clase que está viendo, ¿por qué la máquina virtual debe saber que está anulada? –

+0

@DAVE suena bajo tierra :) Gracias. –

-1

Puede descompilarlo y cargar el código como un proyecto en el IDE de su elección. Normalmente, puede pasar fácilmente a métodos anulados de la clase heredada.

+0

Gracias por su rápida respuesta. Pero, ¿cómo lograr esto con el código Java? :) –

2

Si no puede confiar en el atributo @Override, parece que de acuerdo con the spec no hay otra manera de saber mirando solo la clase. Creo que debes mirar las superclases.

+4

'@ Override' tiene [SOURCE] (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/RetentionPolicy.html#SOURCE) retención. –

+0

@ DᴀᴠᴇNᴇᴡᴛᴏɴ: Gracias. – opqdonut

+0

@DAVE +1. también gracias opqdonut por la respuesta. –

2

Desafortunadamente, no se puede decir eso desde el bytecode. La anotación @Override es solo de carácter consultivo; no es obligatorio.

La JVM define 5 formas de invocar un método. Son invokevirtual, invokeinterface, invokespecial, invokestatic y el nuevo invookedynamic.

Enfoque en invokevirtual: es la forma más común de envío y es la que se utiliza para el caso del que está hablando aquí.

La forma en que invokevirtual funciona es que en el tiempo de ejecución se ve la clase del objeto sobre el que se está enviando. Si encuentra una implementación del método que buscamos, entonces lo llama. Si no, mira la superclase de la clase del objeto y lo intenta de nuevo, y así sucesivamente.

Por lo tanto, no hay forma de que el bytecode indique de manera confiable si un método dado se reemplaza, sin mirar el bytecode para la clase padre.

0

El código de bytes se genera después de la compilación. Por lo tanto, solo asume que el método se debe invocar en función de la variable de referencia, ya que el objeto aún no se ha creado.

Cuestiones relacionadas