Sonntag, Dezember 15, 2019

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 ein MemberInnerClass, in der Terminologie von meinem Beispiel. Ich habe auch eine große Anzahl von Unterklassen von X. Ich hatte einen möglichen Bedarf, um festzustellen, welche Unterklasse der X beteiligt war, für eine gegebene Instanz von MemberInnerClass; ich habe gearbeitet, um dieses nun aber neugierig war deklarieren vs umschließenden Klasse.
InformationsquelleAutor OpenSauce | 2012-02-20

1 Kommentar

  1. 33

    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:

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

    Das gleiche gilt natürlich für nicht-anonyme Klassen in einer Methode 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
      }
    }

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...