Java でのリフレクションによる内部クラスのインスタンス化
内部クラスをインスタンス化しようとすると、開発者は InstantiationException が発生する可能性があります。この例外は、追加の「非表示」パラメータが考慮されていない場合に発生します。このパラメータは、エンケーシング クラスのインスタンスであり、Class.getDeclaredConstructor() を使用するときに指定する必要があります。さらに、ネストされたクラスがエンケース インスタンスを必要としない場合は、ネストされた静的クラスとして宣言できます。
解決策:
リフレクションを使用して内部クラスをインスタンス化するには:
エンケーシング クラスのクラス オブジェクトを取得します:
<code class="java">Class<?> enclosingClass = Class.forName("com.mycompany.Mother");</code>
エンケーシング クラスのインスタンスを作成します:
<code class="java">Object enclosingInstance = enclosingClass.newInstance();</code>
内部クラスのクラス オブジェクトを取得します:
<code class="java">Class<?> innerClass = Class.forName("com.mycompany.Mother$Child");</code>
Class.getDeclaredConstructor() を使用して内部クラスのコンストラクターを取得し、提供します引数として囲むクラス:
<code class="java">Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass);</code>
コンストラクターを呼び出し、囲むインスタンスを引数として渡すことにより、内部クラスのインスタンスを作成します:
<code class="java">Object innerInstance = ctor.newInstance(enclosingInstance);</code>
代替解決策:
内部クラスがエンケース インスタンスを必要としない場合は、ネストされた静的クラスとして宣言することを検討してください:
<code class="java">public class Mother { public static class Child { public void doStuff() { // ... } } }</code>
以上がリフレクションを使用して Java で内部クラスをインスタンス化し、InstantiationException を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。