Java 为什么这段代码为最终修饰符生成false?
这是一个相当理论化的问题,但也许你知道的规范很深,可以让你回答。。。如果匿名类是final,为什么这段代码会产生false?实际上,该类可以被视为最终类(如果没有字节码操作,就无法扩展它):Java 为什么这段代码为最终修饰符生成false?,java,reflection,final,specifications,anonymous-class,Java,Reflection,Final,Specifications,Anonymous Class,这是一个相当理论化的问题,但也许你知道的规范很深,可以让你回答。。。如果匿名类是final,为什么这段代码会产生false?实际上,该类可以被视为最终类(如果没有字节码操作,就无法扩展它): 因为您正在检查的匿名内部类,Modifiers$1,不是final 变量r是final,但这并不意味着类本身是final,因为您正在检查的匿名内部类,Modifiers$1,不是final 变量r是final,但这并不意味着类本身是final,这不是我要问的问题。该文件注意到,类别修改器$1不被视为最终版本
因为您正在检查的匿名内部类,
Modifiers$1
,不是final
变量
r
是final
,但这并不意味着类本身是final
,因为您正在检查的匿名内部类,Modifiers$1
,不是final
变量
r
是final
,但这并不意味着类本身是final
,这不是我要问的问题。该文件注意到,类别修改器$1不被视为最终版本。假设以下声明没有字段:new Runnable(){public void run(){}}.run();行为将完全相同…因为您发现匿名内部类根本不是final
。为什么它不是最终版
?这不是我要问的问题。该文件注意到,类别修改器$1不被视为最终版本。假设以下声明没有字段:new Runnable(){public void run(){}}.run();行为将完全相同…因为您发现匿名内部类根本不是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()));
}
}