封闭类与声明类

时间:2012-02-20 11:03:12

标签: java reflection

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

输出:

{{1}}

1 个答案:

答案 0 :(得分:30)

在这里找到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<S> { }
    return Bar.class;
  }

  static void main(String[] args) throws NoSuchFieldException {
    System.out.println(new Foo<Void>().bar().getDeclaringClass()); // null
    System.out.println(new Foo<Void>().bar().getEnclosinglass()); // Foo
  }
}