Java 封闭类与声明类
在任何情况下,Java 封闭类与声明类,java,reflection,Java,Reflection,在任何情况下,Class.getDeclaringClass是否会给出与Class.getEnclosuringClass不同的结果 我认为这可能与外部类的子类实例化未声明为静态的内部类有关,但我无法通过这种方式获得差异: public class Main { private static class StaticInnerClass { } private class MemberInnerClass { } private static class ChildC
Class.getDeclaringClass
是否会给出与Class.getEnclosuringClass
不同的结果
我认为这可能与外部类的子类实例化未声明为静态的内部类有关,但我无法通过这种方式获得差异:
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
可在此处找到:
“getDeclaringClass的微妙之处在于,在Java语言规范中,匿名内部类不算作类的成员,而命名内部类则算作类的成员。因此,此方法为匿名类返回null。GetEnclosuringClass的替代方法适用于匿名类和命名类。”
例如:
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
}
}
class-Foo{
类bar()引发NoSuchFieldException{
类条{}
返回Bar.class;
}
静态void main(字符串[]args)引发NoSuchFieldException{
System.out.println(new Foo().bar().getDeclaringClass());//null
System.out.println(新的Foo().bar().getEnclosuringlass());//Foo
}
}
@MartinL:我有一个classX
,用我的例子中的术语,它声明了一个MemberInnerClass
。我还有大量X
的子类。我可能需要确定MemberInnerClass
的给定实例涉及X
的哪个子类;我现在已经解决了这个问题,但对声明vs封闭类很好奇。