封闭类与声明类
在任何情况下, 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 } }