public class InvokeTester { public InvokeTester() { } String str; public InvokeTester(String str) { this.str = str; } public int add(int param1, int param2) { return param1 + param2; } public String echo(String msg) { return "echo: " + msg; } public String getStr() { return "one param ctor" + str; } public static void main(String[] args) throws Exception { //直接獲取類 //Class<?> classType = InvokeTester.class; //通過完整的型別路徑獲取類 Class<?> classType = Class.forName("com.top.utils.InvokeTester"); //使用newInstance建立物件 // Object invokeTester = classType.newInstance(); //使用預設建構函式獲取物件 Object invokeTester = classType.getConstructor(new Class[]{}).newInstance(new Object[]{}); //獲取InvokeTester類的add()方法 Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class}); //呼叫invokeTester物件上的add()方法 Object result = addMethod.invoke(invokeTester, new Object[]{new Integer(100), new Integer(200)}); System.out.println((Integer) result); //獲取InvokeTester類的echo()方法 Method echoMethod = classType.getMethod("echo", new Class[]{String.class}); //呼叫invokeTester物件的echo()方法 result = echoMethod.invoke(invokeTester, new Object[]{"Hello"}); System.out.println((String) result); //建立有參建構函式的類物件 Object invokeTester1 = classType.getConstructor(new Class[]{String.class}).newInstance(new Object[]{new String("測試一個帶引數的構造呼叫")}); //獲取方法方式相同 Method getStrMethod = classType.getMethod("getStr"); Object str = getStrMethod.invoke(invokeTester1); System.out.println(str); } }
在例程InvokeTester類的main()方法中,運用反射機制呼叫一個InvokeTester物件的add()和echo()方法
add()方法的兩個引數為int 型別,獲得表示add()方法的Method物件的程式碼如下:
Method addMethod=classType.getMethod("add",new Class[]{int.class,int.class});
Method類的invoke(Object obj,Object args[])方法接收的引數必須為物件,如果引數為基本型別資料,必須轉換為相應的包裝型別的物件。invoke()方法的返回值總是物件,如果實際被呼叫的方法的返回型別是基本型別資料,那麼invoke()方法會把它轉換為相應的包裝型別的物件,再將其返回。
在本例中,儘管InvokeTester 類的add()方法的兩個引數以及返回值都是int型別,呼叫add Method 物件的invoke()方法時,只能傳遞Integer 型別的引數,並且invoke()方法的返回型別也是Integer 型別,Integer 類是int 基本型別的包裝類:
Object result=addMethod.invoke(invokeTester,
new Object[]{new Integer(100),new Integer(200)});
System.out.println((Integer)result); //result 為Integer型別
部落格搬家了。本文新地址:http://www.zicheng.net/article/3