qué que propiedades personalizar jfc ejemplos consiste componentes clase java arrays core modifier

java - que - Resultado incorrecto devuelto por isAbstract() de la clase Modifier



swing java definition (5)

A mi entender, el siguiente código debería imprimir False , sin embargo, cuando ejecuté este código, se está imprimiendo en True .

De la documentación de Java:

Devuelve verdadero si el argumento entero incluye el modificador abstracto, falso de lo contrario.

public class Test{ public static void main(String[] args) { System.out.println(Modifier.isAbstract(byte[].class.getModifiers())); } }

¿Puede alguien ayudarme a entender este comportamiento?


De mi entendimiento, la especificación del lenguaje java para getModifier() es:

Si la clase subyacente es una clase de matriz, entonces sus modificadores públicos, privados y protegidos son los mismos que los de su tipo de componente. Si esta Clase representa un tipo primitivo o vacío, su modificador público siempre es verdadero y sus modificadores protegidos y privados son siempre falsos

Ahora, los valores de sus otros modificadores no están determinados por esta especificación, por ejemplo, ABSTRACT .

De la tabla 4.1-A de JVMS:

ACC_ABSTRACT 0x0400 Resumen declarado; no debe ser instanciado


El Javadoc de int java.lang.Class.getModifiers () especifica qué se debe devolver para algunos de los modificadores para los tipos de matriz (por ejemplo, el modificador final debe ser true y el modificador de la interface debe ser false ). Por otro lado, no especifica cuáles deberían ser los modificadores abstract o static para los tipos de matriz, lo que significa que la decisión de devolver true o false no está documentada en el JDK. Por lo tanto, cualquier implementación puede elegir devolver true o false .

int java.lang.Class.getModifiers ()

Devuelve los modificadores de lenguaje Java para esta clase o interfaz, codificados en un entero. Los modificadores consisten en las constantes de la Máquina Virtual Java para público, protegido, privado, final, estático, abstracto e interfaz; deben decodificarse utilizando los métodos de la clase Modifier.

Si la clase subyacente es una clase de matriz, entonces sus modificadores públicos, privados y protegidos son los mismos que los de su tipo de componente . Si esta Clase representa un tipo primitivo o vacío, su modificador público siempre es verdadero, y sus modificadores protegidos y privados son siempre falsos. Si este objeto representa una clase de matriz , un tipo primitivo o un vacío, entonces su modificador final siempre es verdadero y su modificador de interfaz siempre es falso . Los valores de sus otros modificadores no están determinados por esta especificación.

Las codificaciones modificadoras se definen en la especificación de la máquina virtual de Java, tabla 4.1.


La definición de abstract dice:

Una clase abstracta es una clase que está incompleta, o que se considera incompleta.

Si hubiera una matriz pura como [] , sería incompleta ya que no se proporciona ningún tipo de componente.

Esto violaría la especificación de 15.10.1. Expresiones de creación de matrices :

Es un error en tiempo de compilación si el ClassOrInterfaceType no denota un tipo confiable.

No solo denota un tipo confiable, sino ningún tipo en absoluto. Por lo tanto, sería imposible crear instancias de [] , al igual que para las clases abstractas.

Como no hay una matriz pura [] esto es solo una especie de especulación. Además los modificadores fueron devueltos para el byte[] . Sigue siendo la especificación mostrada por Eran .


Mi explicación sería que los arreglos se consideran abstract porque los crea JVM.

Simplemente no existe una clase concreta para ningún tipo de matriz.

Una matriz tiene un contrato definido por el JLS :

  1. Índice de accesibilidad
  2. Implementación para Cloneable y Serializable

Pero nadie, excepto el lenguaje en sí, puede cumplirlos, porque realmente no podemos declarar una implementación por nosotros mismos.


Se puede encontrar una pista sobre este comportamiento en el JLS, 10.8. Objetos de clase para matrices :

Cada matriz tiene un objeto de Clase asociado, compartido con todas las otras matrices con el mismo tipo de componente.

Aunque un tipo de matriz no es una clase, el objeto Clase de cada matriz actúa como si: [snipped]

Bajo este razonamiento, una matriz no es una clase "real", por lo que definitivamente no es una clase concreta. La misma lógica se aplicaría a int.class siendo considerado abstracto.