封闭类与声明类 [英] Enclosing class vs Declaring class

查看:109
本文介绍了封闭类与声明类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有任何情况 Class.getDeclaringClass 可以从 Class.getEnclosingClass 中提供不同的结果?



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

  public class Main {
private static class StaticInnerClass {

}

私有类MemberInnerClass {

}

私有静态类ChildClass扩展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



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

例如:

 公共类测试{
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()抛出NoSuchFieldException {
class Bar< S> {}
返回Bar.class;
}

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


Are there any circumstances in which Class.getDeclaringClass could give a different result from Class.getEnclosingClass?

I thought it may be to do with a subclass of the outer class instantiating an inner class that was not declared as static, but I wasn't able to get a difference that way:

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() );
  }
}

Output:

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

解决方案

Found here http://kickjava.com/1139.htm#ixzz1mv2nEWg7:

"The subtilty with getDeclaringClass is that anonymous inner classes are not counted as member of a class in the Java Language Specification whereas named inner classes are. Therefore this method returns null for an anonymous class. The alternative method getEnclosingClass works for both anonymous and named classes."

For example:

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();
    }
}

The same holds for non-anonymous classes in a method scope:

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
  }
}

这篇关于封闭类与声明类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆