使用 strictfp 修饰符声明的 Java class 无法通过 Modifier.isStrict(int) 进行测试

Java class declared with strictfp modifier fails test with Modifier.isStrict(int)

需要说明的是,这个问题完全是假设性的。就我个人而言,现实世界不需要这种行为;无意中发现的

灵感来自:How to make a (static) initializer block strictfp?

如果我用 strictfp 修饰符声明 Java class:

public strictfp class PublicStrictfpClass
{
    public double f() { return 2d / 3d; }
}

... 然后我使用 Modifier.isStrict(int):

进行测试
public static void main(String[] argArr)
{
    if (! Modifier.isStrict(PublicStrictfpClass.class.getModifiers()))
    {
        throw new IllegalStateException("Unreachable code");
    }
}

以上代码失败:方法 main() 抛出 IllegalStateException。我尝试了 class 声明 没有方法 PublicStrictfpClass.f() - 都失败了。

我是不是误会了...?

我是 运行 来自 Linux 的代码,使用的是 OpenJDK 8 的最新补丁。

最后,我在问这个问题之前做了一堆谷歌搜索。关键字strictfp在野外非常罕见!

这可能是因为 class modifiers in the class file do not include the strictfp (don't know why, must ask Java developers). This is what the getModifiers() method looks into, its documentation 声明:“修饰符由 Java 虚拟机的 publicprotectedprivatefinalstaticabstractinterface”。(所以没有提及 strictfp

您仍然可以获得f方法的修饰符。方法修饰符确实包括 strictfp:

Modifier.isStrict(PublicStrictfpClass.class.getMethod("f").getModifiers())