框架開發、動態代理、註解處理器、測試工具等場景,常需在執行期根據方法名稱獲取參數類型、修飾符、返回類型等元資訊。
Class.getDeclaredMethod(name, paramTypes):精確匹配參數類型取得 MethodMethod.getParameterTypes():回傳 Class[] 參數類型陣列Method.getGenericParameterTypes():保留泛型資訊(Type[])
import java.lang.reflect.Method;
import java.util.Arrays;
public class ReflectionParamDemo {
public static void main(String[] args) throws Exception {
// 目標類別
Class<?> clazz = DemoService.class;
// 1. 獲取所有公開方法
System.out.println("=== 所有公開方法 ===");
for (Method m : clazz.getMethods()) {
System.out.printf("%s %s(%s)%n",
m.getReturnType().getSimpleName(),
m.getName(),
Arrays.toString(m.getParameterTypes()));
}
// 2. 根據方法名與參數類型精確獲取
Class<?>[] paramTypes = {String.class, int.class, boolean.class};
Method target = clazz.getDeclaredMethod("process", paramTypes);
System.out.println("\n=== 目標方法詳情 ===");
System.out.println("方法名:" + target.getName());
System.out.println("返回類型:" + target.getReturnType());
System.out.println("參數類型:" + Arrays.toString(target.getParameterTypes()));
System.out.println("泛型參數類型:" + Arrays.toString(target.getGenericParameterTypes()));
System.out.println("修飾符:" + Modifier.toString(target.getModifiers()));
// 3. 動態調用
Object instance = clazz.getDeclaredConstructor().newInstance();
Object result = target.invoke(instance, "測試資料", 123, true);
System.out.println("\n調用結果:" + result);
}
}
class DemoService {
public String process(String name, int id, boolean flag) {
return String.format("處理完成:%s #%d flag=%b", name, id, flag);
}
public void otherMethod() {}
}
=== 所有公開方法 ===
String process(String, int, boolean)
Void otherMethod()
Void wait(long, int)
...
=== 目標方法詳情 ===
方法名:process
返回類型:class java.lang.String
參數類型:[class java.lang.String, int, boolean]
泛型參數類型:[class java.lang.String, int, boolean]
修飾符:public
調用結果:處理完成:測試資料 #123 flag=true
-parameters,可用 Parameter.getName() 取得原始參數名。Type 為 ParameterizedType 時,可進一步取得實際泛型參數(如 List<String> 的 String)。MethodHandle 或生成字節碼(ASM/ByteBuddy)加速。getMethod 只能取得公開方法(含繼承);getDeclaredMethod 可取得私有/包私有但不含繼承。int.class、boolean.class 等,非包裝類別。String[].class)。