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

深度解析 Java 反射機制:核心原理與實戰應用

     編輯:Java 相關知識

什麼是 Java 反射機制?

Java 反射機制是指在運行狀態下,對於任意一個類,都能夠獲取該類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性。這種動態獲取信息以及動態調用對象方法的功能稱為 Java 語言的反射機制。反射概念最早由 Smith 於 1982 年提出,指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。

反射的核心用途

  • 在運行時判斷任意一個對象所屬的類
  • 在運行時構造任意一個類的對象
  • 在運行時判斷任意一個類所具有的成員變量和方法
  • 在運行時調用任意一個對象的方法

反射的三大核心步驟

  1. 獲取目標類的 Class 對象
  2. 通過 Class 對象獲取目標類的方法或屬性
  3. 調用獲取到的方法或操作屬性

獲取 Class 對象的三種方式

// 方式一:Class.forName() 靜態方法
Class<?> cls = Class.forName("java.lang.String");

// 方式二:類的 .class 語法
Class<?> cls = String.class;

// 方式三:對象的 getClass() 方法
String str = "abc";
Class<?> cls = str.getClass();

實戰範例:動態調用方法

public class ReflectionTest {
    public static void main(String[] args) throws Exception {
        Display display = new Display();
        // 1. 獲取 Class 對象
        Class<?> cls = display.getClass();
        // 2. 獲取方法對象
        Method method = cls.getMethod("show", String.class);
        // 3. 調用方法
        method.invoke(display, "Wanggc");
    }
}

class Display {
    public void show(String name) {
        System.out.println("Hello: " + name);
    }
}

實戰範例:動態操作屬性

// 使用 Field 類操作私有屬性
Field[] fields = fromClass.getDeclaredFields();
for (Field field : fields) {
    field.setAccessible(true); // 破解私有封裝
    Object value = field.get(sourceObj);
    field.set(targetObj, value);
}

實戰範例:動態創建對象

// 無參構造器
Object instance = clazz.newInstance();

// 帶參構造器
Constructor<?> constructor = clazz.getDeclaredConstructor(int.class, String.class);
Object instance = constructor.newInstance(24, "wanggc");

getMethods vs getDeclaredMethods 區別

方法訪問權限包含父類
getMethods()public是
getDeclaredMethods()所有否

反射雖然強大,但會破壞封裝性,且有性能開銷,實際開發中需權衡使用。

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