为什么此代码对最终修饰符产生错误?

时间:2014-08-08 11:52:41

标签: java reflection final specifications anonymous-class

这是一个理论上的问题,但也许你知道深度的规范会让你回答......为什么这个代码在匿名类是最终的时候会产生错误?在实践中,类可以被认为是final(没有字节码操作就无法扩展它):

public class Modifiers
{
    public static void main(final String[] args) throws ClassNotFoundException
    {

        new Modifiers().go();
    }

    public void go() throws ClassNotFoundException
    {
        final Runnable r = new Runnable()
        {
            @Override
            public void run()
            {
                System.out.println("Inside runnable");
            }
        };
        r.run();
        System.out.println(Modifier.isFinal(getClass().getClassLoader().loadClass(Modifiers.class.getName() + "$1").getModifiers()));
    }
}

2 个答案:

答案 0 :(得分:4)

因为您要检查的匿名内部类Modifiers$1不是final

变量rfinal,但这并不意味着该类本身为final

答案 1 :(得分:1)

好的......明白了:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.9.5无论如何 - 谢谢你的支持!