修饰符类的isAbstract()返回的结果不正确

Jok*_*ker 47 java arrays core modifier

据我所知,应该打印以下代码False,但是当我运行此代码时,它正在打印True.

来自Java文档:

如果整数参数包含abstract修饰符,则返回true,否则返回false.

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

有人可以帮我理解这种行为吗?

Era*_*ran 49

所述的的Javadoc INT java.lang.Class.getModifiers()指定了应该为部分改性剂数组类型的(例如,被返回final改性剂需要是trueinterface改性剂需要是false).另一方面,它没有指定数组类型应该是什么abstractstatic修饰符,这意味着返回truefalse没有在JDK中记录的决定.因此任何实现都可以选择返回truefalse.

int java.lang.Class.getModifiers()

返回此类或接口的Java语言修饰符,以整数编码.修饰符由Java虚拟机的常数公众,保护私人的,最终的,静态的,抽象和接口的; 它们应该使用类Modifier的方法进行解码.

如果底层类是数组类,则其public,private和protected修饰符与其组件类型相同.如果此Class表示基本类型或void,则其public修饰符始终为true,其protected和private修饰符始终为false.如果此对象表示数组类,基本类型或void,则其最终修饰符始终为true,其接口修饰符始终为false.其他修饰符的值不是由本规范确定的.

修饰符编码在Java虚拟机规范表4.1中定义.

  • 对于那些挖掘实际规格并向我指出我还不知道的人来说总是+1. (10认同)

Mur*_*nik 6

可以在JLS,10.8中找到对此行为的提示.数组的类对象:

每个数组都有一个关联的Class对象,与具有相同组件类型的所有其他数组共享.

虽然数组类型不是类,但每个数组的Class对象的行为如下:[snipped]

在这种推理下,数组不是"真正的"类,所以它绝对不是具体的类.同样的逻辑适用于int.class被认为是抽象的.