java.lang.reflect.Method
一、Method類是什么
Method是一個類,位於java.lang.reflect包下。
在Java反射中 Method類描述的是 類的方法信息,通俗來講 有一個類如下:
1 package com.testReflect; 2 3 public class MethodDemo { 4 private int num = 2; 5 private String str = "xixi"; 6 7 public int addResult(int addNum){ 8 return num + addNum; 9 } 10 11 @Override 12 public String toString() { 13 return "MethodDemo [num=" + num + ", str=" + str + "]"; 14 } 15 }
在Java反射中MethodDemo類中的方法addResult(int addNum)、toString()都是Method類的實例,這個Method類的實例描述了方法的全部信息。(包括:方法修飾符、方法名稱、參數列表 等等)
二、如何獲取Method類對象
一共有4種方法,全部都在Class類中:
- getMethods(): 獲得類的public類型的方法
- getMethod(String name, Class[] params): 獲得類的特定方法,name參數指定方法的名字,params參數指定方法的參數類型
- getDeclaredMethods(): 獲取類中所有的方法(public、protected、default、private)
- getDeclaredMethod(String name, Class[] params): 獲得類的特定方法,name參數指定方法的名字,params參數指定方法的參數類型
三、Method類常用方法
對於類中的方法,我們常用的操作:調用方法。
1 package com.testReflect; 2 import java.lang.reflect.Method; 3 import java.lang.reflect.Modifier; 4 public class MethodTest { 5 public static void main(String[] args) throws Exception { 6 //使用反射第一步:獲取操作類MethodDemoFieldDemo所對應的Class對象 7 Class<?> cls = Class.forName("com.testReflect.MethodDemo"); 8 //使用MethodDemo類的class對象生成 實例 9 Object obj = cls.newInstance(); 10 11 //獲取public int addResult(int addNum)方法 12 Method addMethod = cls.getMethod("addResult", new Class[]{int.class}); 13 System.out.println("修飾符: " + Modifier.toString(addMethod.getModifiers())); 14 System.out.println("返回值: " + addMethod.getReturnType()); 15 System.out.println("方法名稱: " + addMethod.getName()); 16 System.out.println("參數列表: " + addMethod.getParameterTypes()); 17 int result = (int)addMethod.invoke(obj, 2); 18 System.out.println("調用addResult后的運行結果:" + result); 19 20 System.out.println("--------------------------------"); 21 22 //獲取public String toString() 方法 23 Method toStringMethod = cls.getMethod("toString", new Class[]{}); 24 System.out.println("修飾符: " + Modifier.toString(toStringMethod.getModifiers())); 25 System.out.println("返回值: " + toStringMethod.getReturnType()); 26 System.out.println("方法名稱: " + toStringMethod.getName()); 27 System.out.println("參數列表: " + toStringMethod.getParameterTypes()); 28 String msg = (String)toStringMethod.invoke(obj); 29 System.out.println("調用toString后的運行結果:" + msg); 30 } 31 }
Method類的invoke(Object obj,Object args[])方法接收的參數必須為對象,如果參數為基本類型數據,必須轉換為相應的包裝類型的對象。invoke()方法的返回值總是對象,如果實際被調用的方法的返回類型是基本類型數據,那么invoke()方法會把它轉換為相應的包裝類型的對象,再將其返回.