Heim > Java > javaLernprogramm > Hauptteil

So instanziieren Sie innere Klassen mit Reflection in Java: Warum brauchen wir eine umschließende Klasseninstanz?

DDD
Freigeben: 2024-10-29 08:09:30
Original
957 Leute haben es durchsucht

How to Instantiate Inner Classes with Reflection in Java: Why Do We Need an Enclosing Class Instance?

Instanziierung innerer Klassen mit Reflection in Java

Das Erstellen von Instanzen innerer Klassen mithilfe von Reflection in Java kann häufig zu Ausnahmen führen, die der hier aufgetretenen ähneln. Um dieses Problem zu lösen, ist es von entscheidender Bedeutung, die Nuancen der Instanziierung innerer Klassen durch Reflexion zu verstehen.

Beim Versuch, eine innere Klasse direkt über Class.forName(...) und newInstance() zu instanziieren, tritt die zugrunde liegende InstantiationException auf, weil inner Klassen haben einen zusätzlichen „versteckten“ Parameter – die Instanz der umschließenden Klasse.

Um dies zu beheben, verwenden Sie den folgenden Ansatz:

  1. Erhalten Sie die umschließende Klasse mit Class.forName(. ..).
  2. Erstellen Sie eine Instanz der umschließenden Klasse mit newInstance().
  3. Rufen Sie die innere Klasse mit Class.forName(...) ab.
  4. Verwenden Sie getDeclaredConstructor (...) um auf den Konstruktor der inneren Klasse zuzugreifen und die umschließende Klasse als Argument anzugeben.
  5. Instanziieren Sie schließlich die innere Klasse mit dem abgerufenen Konstruktor und geben Sie die umschließende Klasseninstanz als ersten Parameter an.

Zum Beispiel:

<code class="java">// Exception handling omitted
Class<?> enclosingClass = Class.forName("com.mycompany.Mother");
Object enclosingInstance = enclosingClass.newInstance();

Class<?> innerClass = Class.forName("com.mycompany.Mother$Child");
Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass);

Object innerInstance = ctor.newInstance(enclosingInstance);</code>
Nach dem Login kopieren

Wenn die innere Klasse alternativ keinen Zugriff auf die umschließende Klasse benötigt, sollten Sie sie stattdessen als verschachtelte statische Klasse deklarieren, wie hier dargestellt:

<code class="java">public class Mother {
    public static class Child {
        public void doStuff() {
            // ...
        }
    }
}</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo instanziieren Sie innere Klassen mit Reflection in Java: Warum brauchen wir eine umschließende Klasseninstanz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage