反射 API 讓程序在運行時檢查類結構、創建實例、訪問字段、調用方法,是 IDE、調試器、框架(Spring、Hibernate)的基石。本文通過 Employee 類示例,演示類信息提取、方法/字段/構造器枚舉、運行時動態調用全流程。
obj.getClass())。public class Employee {
public String empNum, empName;
public Employee() { this("1", "King"); }
public Employee(String n, String name) { empNum=n; empName=name; }
public String toString() { return "EmpNum:"+empNum+", EmpName:"+empName; }
}
Employee e = new Employee();
Class<?> clazz = e.getClass();
System.out.println("類名: " + clazz.getName());
System.out.println("父類: " + clazz.getSuperclass().getName());
int mods = clazz.getModifiers();
System.out.println("public: " + Modifier.isPublic(mods));
System.out.println("final: " + Modifier.isFinal(mods));
System.out.println("abstract: " + Modifier.isAbstract(mods));
輸出:類名: Employee, 父類: java.lang.Object, public: true, final: false, abstract: false
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) System.out.println(m);
輸出包含 toString、getEmpNum、setEmpNum 等。
Field[] fields = clazz.getFields(); // 僅 public
for (Field f : fields) System.out.println(f);
輸出:public java.lang.String Employee.empNum、public java.lang.String Employee.empName
Constructor[] ctors = clazz.getConstructors();
for (Constructor c : ctors) {
System.out.println(c);
Class[] params = c.getParameterTypes();
for (int i=0;i
輸出兩個構造器:(String, String) 與 ()。
Class> dynamicClass = Class.forName("com.example.ServiceImpl");
Object instance = dynamicClass.newInstance(); // 或獲取構造器 newInstance(args)
Method method = dynamicClass.getMethod("setProperties", Properties.class);
method.invoke(instance, new Properties());
此模式廣泛用於插件系統、腳本引擎、配置驅動框架。
Method/Field/Constructor 對象,或使用 MethodHandle/Invokedynamic (Java 7+)。setAccessible(true) 可破壞封裝,需配合 SecurityManager 控制。opens 導出包才能深度反射內部類。