Posted on 2007-07-11 20:32
冰浪 閱讀(348)
評論(0) 編輯 收藏 所屬分類:
Java
使用反射來調用類的方法,需要使用java.lang.reflect.Method中的invoke方法,Object??invoke(Object obj, Object[] args),第一個參數是指需要調用的那個方法的隱式參數,也即那個方法所屬的對象,如果調用的是一個靜態方法將第一個參數指定為null,第二個參數是指需要調用的那個方法的顯式參數,因為一個方法可以有很多個參數所以在這里我們必須用一個數組來存放這些參數,注意這個方法使用的是對象數組,在存放時盡管有值類型我們也要把相應的包裝器類存放進去,當調用的這個方法有返回值,這在Java中是一個令人煩惱的問題,如果返回來的是一個對象還好,我們只需將invoke返回的Object強制轉換成特定的對象就可以,可是返回一個值類型呢?我們要使用就麻煩了,首先要對其解包裝,在用其包裝對象的方法返回普通值!我們編程思路很重要是吧!
編程的基本思路:
首先獲得需要被調用的方法的指針,其實說指針不是那么好理解,而java的方法指針也一度的引起很大的爭論,我們干脆叫引用吧!怎么獲的引用呢?可使用Class類的getMethod方法該方法返回一個Method,接著我們在使用Method的invoke方法調用這個引用所指向的方法,就這么簡單,我一直認為用一個簡單的例子講訴一個復雜的概念是最注重實效的!(在JDK1.4下調試通過)
import java.lang.reflect.*;
public class InvokeMethods
{
public static void main(String[] args)
{
Employee emp = new Employee();
///getClass獲得emp對象所屬的類型的對象,Class就是類的類
///Class是專門用來描述類的類,比如描述某個類有那些字段,
///方法,構造器等等!
Class cl = emp.getClass();
try
{
///getMethod方法第一個參數指定一個需要調用的方法名稱
///這里是Employee類的setAge方法,第二個參數是需要調用
///方法的參數類型列表,是參數類型!如無參數可以指定null
///該方法返回一個方法對象
Method sAge = cl.getMethod("setAge",
new Class[] {int.class});
Method gAge = cl.getMethod("getAge",null);
Method pName = cl.getMethod("printName",
new Class[] {String.class});
/**
*使用invoke調用指定的方法
*/
Object[] args1 = { new Integer(25) };//參數列表
//emp為隱式參數該方法不是靜態方法必須指定
sAge.invoke(emp, args1);
Integer AGE = (Integer)gAge.invoke(emp, null);
int age = AGE.intValue();
System.out.println("The Employee Age is: "+age);
Object[] args3 = {new String("Jack") };
pName.invoke(emp, args3);
}
catch(Exception e) {e.printStackTrace(); }
System.exit(0);
}
}
class Employee
{
//定義一個員工類
public Employee()
{
age = 0;
name = null;
}
//將要被調用的方法
public void setAge(int a)
{
age = a;
}
//將要被調用的方法
public int getAge()
{
return age;
}
//將要被調用的方法
public void printName(String n)
{
name = n;
System.out.println("The Employee Name is: "+name);
}
private int age;
private String name;
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=41104