Umschließenden Klasse vs Klasse Deklarieren
Gibt es irgendwelche Umstände, unter denen Class.getDeclaringClass
geben könnte, ein anderes Ergebnis aus Class.getEnclosingClass
?
Ich dachte, es vielleicht zu tun mit einer Subklasse der äußeren Klasse instanziieren eine innere Klasse, die war nicht als statisch deklariert, aber ich war nicht in der Lage, einen Unterschied so:
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() );
}
}
Ausgabe:
class Main
class Main
class Main
class Main
class Main
class Main
- was ist Ihr Ziel?
- Ich habe eine Klasse
X
was erklärt einMemberInnerClass
, in der Terminologie von meinem Beispiel. Ich habe auch eine große Anzahl von Unterklassen vonX
. Ich hatte einen möglichen Bedarf, um festzustellen, welche Unterklasse derX
beteiligt war, für eine gegebene Instanz vonMemberInnerClass
; ich habe gearbeitet, um dieses nun aber neugierig war deklarieren vs umschließenden Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finden Sie hier http://kickjava.com/1139.htm#ixzz1mv2nEWg7:
"Die Subtilität mit getDeclaringClass ist, dass anonyme innere Klassen werden nicht gezählt als Mitglied einer Klasse in der Java-Sprachspezifikation in der Erwägung, dass benannte innere Klassen sind. Deshalb gibt diese Methode null zurück für eine anonyme Klasse. Die alternative Methode getEnclosingClass funktioniert für sowohl anonyme als auch benannte Klassen."
Beispiel:
Das gleiche gilt natürlich für nicht-anonyme Klassen in einer Methode scope: