2012-02-20 30 views
17

Có bất kỳ trường hợp nào trong đó Class.getDeclaringClass có thể cho kết quả khác với Class.getEnclosingClass không?Bao gồm lớp học vs Khai báo lớp

tôi nghĩ rằng nó có thể làm gì với một lớp con của lớp bên ngoài instantiating một lớp bên trong mà không được khai báo là tĩnh, nhưng tôi đã không thể có được một sự khác biệt như vậy:

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 
+0

mục đích của bạn là gì ? – MartinL

+0

@MartinL: Tôi có một lớp 'X' khai báo' MemberInnerClass', trong thuật ngữ của ví dụ của tôi. Tôi cũng có một số lượng lớn các lớp con của 'X'. Tôi có thể cần xác định lớp con nào của' X' đã tham gia vào một ví dụ cụ thể của 'MemberInnerClass'; tôi đã làm việc ed xung quanh điều này bây giờ nhưng đã tò mò về tuyên bố vs kèm theo lớp. – OpenSauce

Trả lời

24

Tìm thấy đây http://kickjava.com/1139.htm#ixzz1mv2nEWg7:

"The subtilty với getDeclaringClass là lớp bên trong vô danh không được tính là thành viên của một lớp trong ngày e Đặc tả Ngôn ngữ Java trong khi các lớp bên trong được đặt tên là. Do đó phương thức này trả về null cho một lớp ẩn danh. Phương pháp thay thế getEnclosingClass làm việc cho cả hai lớp vô danh và có tên là "

Ví dụ:.

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

Cùng giữ cho các lớp học không vô danh trong một phạm vi phương pháp:

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 
    } 
} 
Các vấn đề liên quan