在 Java 中使用反射創建內部類別的實例通常會導致類似於此處遇到的異常。透過反射來理解內部類別實例化的細微差別對於解決這個問題至關重要。
當嘗試直接透過Class.forName(...) 和newInstance() 實例化內部類別時,會發生底層的InstantiationException,因為內部類別類別有一個額外的「隱藏」參數- 封閉類別的實例。
要修正此問題,請採用下列方法:
例如:
<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>
或者,如果內部類不需要存取封閉類,請考慮將其聲明為嵌套靜態類,如下所示:
<code class="java">public class Mother { public static class Child { public void doStuff() { // ... } } }</code>
以上是如何在 Java 中使用反射實例化內部類別:為什麼我們需要一個封閉類別實例?的詳細內容。更多資訊請關注PHP中文網其他相關文章!