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

Java 核心概念進階 (二):反射、介面、內部類與代理模式深度解析

     編輯:Java 程式設計入門

前言:從語法到元編程的跨越

Java 基礎語法掌握後,進階開發者必須征服反射機制、介面契約、內部類封裝、代理模式四大核心領域。這些特性構成了框架開發、庫設計、動態擴展的基石,是邁向架構師的必經之路。

21-22. Class 物件與反射機制:運行時的類型資訊中樞

Class 物件本質

  • 每個載入的類/介面/陣列/基本型別/void 在 JVM 中對應唯一 `Class` 實例
  • `Object.getClass()` 返回該物件運行時真實類別的 `Class` 物件
  • 類載入時機:主類啟動 → 遞歸載入所有依賴類

反射核心 API (java.lang.reflect)

API用途
`Field`檢查/修改欄位 (含私有,需 `setAccessible(true)`)
`Method`檢查/調用方法 (含私有),支援參數型別檢查
`Constructor`檢查/實例化建構子

反射四大核心能力

  1. 運行時分析類結構:框架掃描註解、自動裝配、序列化
  2. 運行時檢測物件:動態判斷型別、調用未知方法
  3. 通用陣列操作:`Array.newInstance()`、`Array.get/set()`
  4. 方法物件化:`Method` 實例可傳遞、存儲、延遲調用 (替代函數指標)

介面優於方法指標

Java 無 C 風格函數指標。需傳遞行為時,定義單一方法介面 (SAM),實作類傳遞實例。JDK 8+ Lambda 進一步簡化:`Runnable r = () -> System.out.println("Hi");`

23-25. 介面:契約導向設計的基石

核心定位

  • 介面**不是類**,是「符合要求的類必須遵守的契約」
  • 只宣告「做什麼」 (方法簽名),不規定「怎麼做」 (實作)
  • 類可 `implements` 多個介面,但只能 `extends` 一個父類

實作兩步驟

  1. `class MyClass implements MyInterface` 宣告實作意圖
  2. 提供介面中**所有方法**的實作定義

關鍵特性

  • 介面不可 `new` 實例化,但可宣告介面型別變數指向實作實例
  • 介面間可 `extends` (單繼承),構建契約層次
  • 標記介面 (Marker Interface):無方法定義,賦予語義 (如 `Serializable`、`Cloneable`、`Remote`)
  • `Cloneable` 核心協議:實作類必須覆寫 `clone()` 並拋出 `CloneNotSupportedException` 或返回拷貝

26. 介面與回調模式:控制反轉的雛形

回調模式:指定「特定事件發生時調用對象的某方法」。

// 經典範例:ActionListener
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) { /* 回調邏輯 */ }
});

// 相關 API
javax.swing.Timer          // 定時回調
javax.swing.JOptionPane    // 對話框關閉回調
java.awt.Toolkit           // 系統級事件回調

此模式是 Spring IoC、事件驅動架構、觀察者模式的基礎變體。

27. 物件複製:clone() 的陷阱與最佳實踐

  • `clone()` 是 `Object` **protected** 方法,外部不可直接調用
  • 實作類必須:`implements Cloneable` + `public Object clone() throws CloneNotSupportedException`
  • 預設為**淺拷貝** (基本型別複製、引用共享),深拷貝需手工遞歸複製引用物件
  • 現代替代:複製建構子 `new Foo(foo)`、靜態工廠 `Foo.copyOf(foo)`、序列化反序列化、MapStruct/Dozer 映射庫

28. 內部類:封裝與回調的利器

四大存在理由

  1. 存取外部類私有成員:內部類實例持有外部類實例隱含引用 (`OuterClass.this`)
  2. 封裝隱藏:同包其他類不可見 (若為 `private`/`package-private`)
  3. 匿名內部類簡化回調:`new Interface() { ... }` 即時實作
  4. 事件驅動程式自然契合:每個事件監聽器對應一個內部類實例

內部類分類

類型特徵典型用途
成員內部類非 static,關聯外部實例迭代器、視圖適配器
靜態巢狀類static,無外部實例引用Builder 模式、DTO、工具類
區域內部類定義在方法/區塊內複雜邏輯封裝、臨時實作
匿名內部類無名稱,即時實作介面/繼承類事件監聽、執行緒、比較器

29. 代理類 : 動態攔截的藝術

`java.lang.reflect.Proxy` 動態生成實現指定介面集合的類:

  • 所有介面方法 + `Object` 方法 (`toString`、`equals`、`hashCode`)
  • 核心:`InvocationHandler` 統一攔截所有方法調用
  • 應用:AOP 切面、遠端存根、延遲載入、訪問控制、日誌/事務攔截
Interface proxy = (Interface) Proxy.newProxyInstance(
    classLoader, 
    new Class[] { Interface.class }, 
    (proxyObj, method, args) -> {
        // 統一前置邏輯
        Object result = method.invoke(target, args);
        // 統一後置邏輯
        return result;
    }
);

30. 資料型別系統:強型別的八大基石

Java 8 大基本型別:

分類型別位數預設值包裝類
整數byte80Byte
short160Short
int320Integer
long640LLong
浮點float320.0fFloat
double640.0Double
字符char16'\u0000'Character
布林boolean1 (JVM 實作相關)falseBoolean
  • `char` 使用 UTF-16 編碼單元 (補充字符需 2 個 char)
  • 基本型別非物件,但有對應包裝類支援自動裝箱/拆箱 (JDK 5+)
  • 泛型、集合只能用包裝類/物件型別

總結

反射賦予「運行時感知與操控類型」的元編程能力;介面確立「契約優於實作」的架構邊界;內部類提供「封裝與上下文存取」的語法糖;代理實現「橫切關注點無侵入式織入」。四大特性交織出 Java 動態性、擴展性、框架友好的核心基因。深度掌握它們,才能從「寫出能跑的代碼」進化為「設計優雅可演化的系統」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved