La instrucción invokespecial
JVM se utiliza para llamar a métodos de inicialización (<init>
) al crear objetos nuevos. La descripción de la instrucción sugiere (pero no aclara) que la decisión de llamar al constructor de una superclase o un constructor de la clase actual depende del estado del indicador ACC_SUPER
establecido en el archivo class
.¿Cuál es el propósito del indicador de acceso ACC_SUPER en los archivos de la clase Java?
partir de la especificación JVM de Sun:
A continuación, se selecciona el método de resolver para la invocación a menos que todas las condiciones siguientes:
- La bandera ACC_SUPER (véase la Tabla 4.1, "Clase modificadores de acceso y propiedad ") se establece para la clase actual.
- Source (definición invokespecial
código de operación)
El ajuste de la bandera ACC_SUPER indica cuál de las dos alternativas para la semántica de su instrucción invokespecial la máquina virtual de Java es expresar; el indicador ACC_SUPER existe para la compatibilidad con versiones anteriores del código compilado por los compiladores más antiguos de Sun para el lenguaje de programación Java. Todas las implementaciones nuevas de la máquina virtual Java deben implementar la semántica para invokespecial documentada en esta especificación. Todos los nuevos compiladores del conjunto de instrucciones de la máquina virtual Java deben establecer el indicador ACC_SUPER. Los compiladores antiguos de Sun generaron indicadores de ClassFile con ACC_SUPER unset. Las implementaciones anteriores de la máquina virtual Java de Sun ignoran el indicador si está configurado.
- Source (ClassFile
formato)
La definición establece que la bandera es para mantener la compatibilidad con viejos compiladores. Sin embargo, sigue en contradicción con Sun's older Java virtual machine implementations ignore the flag if it is set.
¿La bandera todavía se utiliza con el código de operación invokespecial
? Por lo que puedo decir, parece no tener ningún propósito y no puedo encontrar un recurso para sugerir que alguna vez lo hizo.
Gracias.
Esto no es una respuesta, pero para entender por qué la bandera se utiliza Creo que también hay que entender lo que significaba la bandera bajo la especificación JVM versión 1 - ver http://java.sun.com/docs/books /jvms/first_edition/html/Instructions2.doc7.html#invokespecial –
Al lado del otro, no puedo ver ninguna diferencia. – Jivings