isAbstract() Modifier returning Incorrect result - Why?

A hint to this behavior may be found in the JLS, 10.8. Class Objects for Arrays:

Every array has an associated Class object, shared with all other arrays with the same component type.

Although an array type is not a class, the Class object of every array acts as if: [snipped]

Under this reasoning, an array isn't a "real" class, so it definitely isn't a concrete class. The same logic would apply to int.class being considered abstract.


The Javadoc of int java.lang.Class.getModifiers() specifies what should be returned for some of the modifiers for array types (for example, the final modifier is required to be true and the interface modifier is required to be false). On the other hand, it doesn't specify what the abstract or static modifiers should be for array types, which means the decision to return true or false is not documented in the JDK. Therefore any implementation can choose to return either true or false.

int java.lang.Class.getModifiers()

Returns the Java language modifiers for this class or interface, encoded in an integer. The modifiers consist of the Java Virtual Machine's constants for public, protected, private, final, static, abstract and interface; they should be decoded using the methods of class Modifier.

If the underlying class is an array class, then its public, private and protected modifiers are the same as those of its component type. If this Class represents a primitive type or void, its public modifier is always true, and its protected and private modifiers are always false. If this object represents an array class, a primitive type or void, then its final modifier is always true and its interface modifier is always false. The values of its other modifiers are not determined by this specification.

The modifier encodings are defined in The Java Virtual Machine Specification, table 4.1.