封闭类与声明类

在任何情况下, Class.getDeclaringClass都可以从Class.getEnclosingClass提供不同的结果吗?

我认为它可能与外部类的子类实例化一个未声明为静态的内部类,但我无法通过这种方式获得差异:

 public class Main { private static class StaticInnerClass { } private class MemberInnerClass { } private static class ChildClass extends Main { } public MemberInnerClass getMemberInnerClassInstance() { return new MemberInnerClass(); } public static void main(String[] args) { System.out.println( StaticInnerClass.class.getDeclaringClass() ); System.out.println( StaticInnerClass.class.getEnclosingClass() ); System.out.println( MemberInnerClass.class.getDeclaringClass() ); System.out.println( MemberInnerClass.class.getEnclosingClass() ); System.out.println( new ChildClass().getMemberInnerClassInstance().getClass().getEnclosingClass() ); System.out.println( new ChildClass().getMemberInnerClassInstance().getClass().getDeclaringClass() ); } } 

输出:

 class Main class Main class Main class Main class Main class Main 

在这里找到http://kickjava.com/1139.htm#ixzz1mv2nEWg7 :

“使用getDeclaringClass的subtilty是匿名内部类不被视为Java语言规范中类的成员,而命名内部类是。因此,此方法为匿名类返回null。替代方法getEnclosingClass适用于匿名类和命名类“。

例如:

 public class Test { public static void main(String[] args) { new Object() { public void test() { System.out.println(this.getClass().getDeclaringClass()); //null System.out.println(this.getClass().getEnclosingClass()); //not null } }.test(); } } 

对于方法范围中的非匿名类也是如此:

 class Foo { Class bar() throws NoSuchFieldException { class Bar { } return Bar.class; } static void main(String[] args) throws NoSuchFieldException { System.out.println(new Foo().bar().getDeclaringClass()); // null System.out.println(new Foo().bar().getEnclosinglass()); // Foo } }