Duplicate :
|
FULL PRODUCT VERSION : java version "1.7.0_40" Java(TM) SE Runtime Environment (build 1.7.0_40-b43) Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode) ADDITIONAL OS VERSION INFORMATION : Darwin ABHISHK2-M-40RU 13.3.0 Darwin Kernel Version 13.3.0: Tue Jun 3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64 x86_64 A DESCRIPTION OF THE PROBLEM : Anonymous class is generated with class modifier as static. The spec says differently. http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.9.5 === An anonymous class declaration is automatically derived from a class instance creation expression by the Java compiler. An anonymous class is never abstract (����8.1.1.1). An anonymous class is always implicitly final (����8.1.1.2). An anonymous class is always an inner class (����8.1.3); it is never static (����8.1.1, ����8.5.1). === STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : In the following code, the printed modifier is "static" when compiled with javac. import java.lang.reflect.Modifier; public class MyClass { public static interface TestInterface{ public void test(); } public static void main(String [] args){ TestInterface t = new TestInterface() { @Override public void test() { System.out.println("created..."); } }; int mods = t.getClass().getModifiers(); System.out.println("Modifiers are: " + Modifier.toString(mods)); } } EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - Modifiers would be empty ACTUAL - Modifier was "static" REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- import java.lang.reflect.Modifier; public class MyClass { public static interface TestInterface{ public void test(); } public static void main(String [] args){ TestInterface t = new TestInterface() { @Override public void test() { System.out.println("created..."); } }; int mods = t.getClass().getModifiers(); System.out.println("Modifiers are: " + Modifier.toString(mods)); } } ---------- END SOURCE ----------