Instanziierung innerer Klassen über Reflection in Java
Beim Versuch, eine innere Klasse zu instanziieren, stoßen Entwickler möglicherweise auf die InstantiationException. Diese Ausnahme tritt auf, wenn ein zusätzlicher „versteckter“ Parameter nicht berücksichtigt wird. Dieser Parameter ist die Instanz der umschließenden Klasse und muss bei Verwendung von Class.getDeclaredConstructor() bereitgestellt werden. Wenn die verschachtelte Klasse außerdem keine umschließende Instanz benötigt, kann sie als verschachtelte statische Klasse deklariert werden.
Lösung:
Um eine innere Klasse mithilfe von Reflektion zu instanziieren :
Erhalten Sie das Klassenobjekt der Encasing-Klasse:
<code class="java">Class<?> enclosingClass = Class.forName("com.mycompany.Mother");</code>
Erstellen Sie eine Instanz der Encasing-Klasse:
<code class="java">Object enclosingInstance = enclosingClass.newInstance();</code>
Erhalten Sie das Klassenobjekt der inneren Klasse:
<code class="java">Class<?> innerClass = Class.forName("com.mycompany.Mother$Child");</code>
Verwenden Sie Class.getDeclaredConstructor(), um den Konstruktor der inneren Klasse abzurufen und bereitzustellen die umschließende Klasse als Argument:
<code class="java">Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass);</code>
Erstellen Sie eine Instanz der inneren Klasse, indem Sie den Konstruktor aufrufen und die umschließende Instanz als Argument übergeben:
<code class="java">Object innerInstance = ctor.newInstance(enclosingInstance);</code>
Alternative Lösung:
Wenn die innere Klasse die umschließende Instanz nicht benötigt, sollten Sie sie als verschachtelte statische Klasse deklarieren:
<code class="java">public class Mother { public static class Child { public void doStuff() { // ... } } }</code>
Das obige ist der detaillierte Inhalt vonWie instanziiere ich innere Klassen in Java mithilfe von Reflection und vermeide InstantiationException?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!