首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 反射實戰:動態建立靜態/非靜態內部類實例的完整步驟解析

     編輯:Java 相關知識

詳細示範如何使用 Java 反射 API 動態載入並實例化內部類,涵蓋 public static、package-private、non-static 內部類的建構子參數差異處理。

基礎類別定義

package javalang;
public class Outer {
  public static class Inner1 {}
}

步驟 1:取得 Class 物件

Class.forName("javalang.Outer$Inner1") // 輸出: class javalang.Outer$Inner1

步驟 2:檢視建構子

// public static 內部類
Class.forName("javalang.Outer$Inner1").getConstructors().length // 1
Class.forName("javalang.Outer$Inner1").getConstructors()[0]     // public javalang.Outer$Inner1()

// 移除 public 修飾字後
.getConstructors().length // 0 (僅回傳 public 建構子)
.getDeclaredConstructors().length // 1 (包含非 public)
.getDeclaredConstructors()[0] // javalang.Outer$Inner1()

步驟 3:實例化

// public static 內部類
Class.forName("javalang.Outer$Inner1")
  .getConstructors()[0].newInstance(); // 成功

// 非 public 內部類
Class.forName("javalang.Outer$Inner1")
  .getDeclaredConstructors()[0].newInstance(); // 成功 (需 setAccessible(true) 或同包)

步驟 4:非靜態內部類 (關鍵差異)

移除 static 後,建構子簽名變為:

javalang.Outer$Inner1(javalang.Outer)

必須傳入外部類實例:

Class.forName("javalang.Outer$Inner1")
  .getDeclaredConstructors()[0].newInstance(new Outer()); // 成功

核心結論

  • getConstructors() 僅回傳 public 建構子;getDeclaredConstructors() 回傳所有宣告建構子。
  • 非靜態內部類**沒有預設無參建構子**,第一個參數**必須是外部類實例**,JVM 隱式新增此參數以維持對外部實例的引用。
  • 反射實例化時需手動提供外部實例,否則拋出 IllegalArgumentException: wrong number of arguments。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved