在任何情况下 Class.getDeclaringClass
可能会给出与 Class.getEnclosureClass
不同的结果?
我认为这可能与外部类的子类实例化一个未声明为静态的内部类有关,但我无法通过这种方式获得差异:
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 的微妙之处在于,匿名内部类在 Java 语言规范中不计为类的成员,而命名内部类则计入。因此,此方法为匿名类返回 null。替代方法 getEnclosureClass 适用于匿名类和命名的类。”
例如:
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
}
}
关于java - 封闭类与声明类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9360072/