isAbstract() 修饰符返回不正确的结果 - 为什么?

2022-08-31 23:39:27

根据我的理解,以下代码应打印为输出False

但是,当我运行此代码时,它正在打印为输出。True

来自 Java 文档:

如果整数参数包含抽象修饰符,则返回 true,否则返回 false。

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

有人能帮助我理解这种行为吗?


答案 1

int java.lang.Class.getModifiers() 的 Javadoc 指定了数组类型的某些修饰符应返回的内容(例如,修饰符需要是 ,修饰符必须是 )。另一方面,它没有指定数组类型的或修饰符应该是什么,这意味着返回或未记录在JDK中的决定。因此,任何实现都可以选择返回 或 。finaltrueinterfacefalseabstractstatictruefalsetruefalse

int java.lang.Class.getModifiers()

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

如果基础类是数组类,则其公共、私有和受保护的修饰符与其组件类型的修饰符相同。如果此类表示基元类型或 void,则其公共修饰符始终为 true,其受保护修饰符和私有修饰符始终为 false。如果此对象表示数组类、基元类型或 void,则其最终修饰符始终为 true,其接口修饰符始终为 false其其他修饰符的值不是由此规范确定的。

修改器编码在 Java 虚拟机规范表 4.1 中定义。


答案 2

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

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

尽管数组类型不是类,但每个数组的 Class 对象都表现得好像:[snipped]

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