我有很多在系統中定義對象的獲取方法的價值,也許1000個對象, 其中一些有這樣的方法:Java的問題,如何從一個不明物體
public Date getDate();
有反正我可以做這樣的事情:
Object o = getFromSomeWhere.....;
Method m = o.getMethod("getDate");
Date date = (Date) m.getValue();
我有很多在系統中定義對象的獲取方法的價值,也許1000個對象, 其中一些有這樣的方法:Java的問題,如何從一個不明物體
public Date getDate();
有反正我可以做這樣的事情:
Object o = getFromSomeWhere.....;
Method m = o.getMethod("getDate");
Date date = (Date) m.getValue();
如果你可以使他們都實現一個接口,這肯定是最好的選擇。但是,反思也將工作,和你的代碼幾乎有:
Object o = getFromSomeWhere.....;
Method m = o.getClass().getMethod("getDate");
Date date = (Date) m.invoke(o);
(有一堆的例外,你需要處理,無可否認...)
對於一個完整的例子:
import java.lang.reflect.*;
import java.util.*;
public class Test
{
public static void main(String[] args) throws Exception
{
Object o = new Test();
Method m = o.getClass().getMethod("getDate");
Date date = (Date) m.invoke(o);
System.out.println(date);
}
public Date getDate()
{
return new Date();
}
}
如果有需要,您可以檢查使用以下代碼GETDATE()方法的接口:
if (o instance of GetDateInterface){
GetDateInterface foo = (GetDateInterface) o;
Date d = foo.getDate();
}
要完成其他答案,我還要確定帶有接口的類。這是我會做它
import java.util.Date;
interface Dated {
public Date getDate();
public void setDate(Date date);
}
class FooObject implements Dated {
private Date date;
public void setDate(Date date) { this.date = date; }
public Date getDate() { return date; }
// other code...
}
public static void main (String[] args) {
Object o = getRandomObject(); // implemented elsewhere
if (o instanceof Dated) {
Date date = ((Dated)o).getDate();
doStuffWith(date);
}
}
試試這個:
Object aDate = new Date();
Method aMethod = aDate.getClass().getMethod("getDate", (Class<Void>[]) null);
Object aResult = aMethod.invoke(aDate, (Void) null);
您應該添加的try-catch,以確定是否真的有調用一個方法之前GETDATE。
如果你不介意額外的依賴,BeanUtils可以爲你做到這一點。
有沒有這些對象實現getDate()方法的接口? – jjnguy 2009-04-28 05:22:10
如果有一個接口,那麼在沒有使用反射的情況下,您可以在投射到該接口之前使用instanceof運算符 – Azder 2009-04-28 05:39:08
沒有接口或相同的父類,因此我必須做反射.... – jojo 2009-04-28 05:45:03