Java 反射機制是指在運行狀態下,對於任意一個類,都能夠獲取該類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性。這種動態獲取信息以及動態調用對象方法的功能稱為 Java 語言的反射機制。反射概念最早由 Smith 於 1982 年提出,指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。
Class 對象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() | public | 是 |
| getDeclaredMethods() | 所有 | 否 |
反射雖然強大,但會破壞封裝性,且有性能開銷,實際開發中需權衡使用。