2009-04-28 16 views
1

我有很多在系統中定義對象的獲取方法的價值,也許1000個對象, 其中一些有這樣的方法:Java的問題,如何從一個不明物體

public Date getDate(); 

有反正我可以做這樣的事情:

Object o = getFromSomeWhere.....; 

Method m = o.getMethod("getDate"); 
Date date = (Date) m.getValue(); 
+0

有沒有這些對象實現getDate()方法的接口? – jjnguy 2009-04-28 05:22:10

+0

如果有一個接口,那麼在沒有使用反射的情況下,您可以在投射到該接口之前使用instanceof運算符 – Azder 2009-04-28 05:39:08

+0

沒有接口或相同的父類,因此我必須做反射.... – jojo 2009-04-28 05:45:03

回答

10

如果你可以使他們都實現一個接口,這肯定是最好的選擇。但是,反思也將工作,和你的代碼幾乎有:

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(); 
    } 
} 
2

如果有需要,您可以檢查使用以下代碼GETDATE()方法的接口:

if (o instance of GetDateInterface){ 
    GetDateInterface foo = (GetDateInterface) o; 
    Date d = foo.getDate(); 
} 
1

要完成其他答案,我還要確定帶有接口的類。這是我會做它

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); 
    } 
} 
3

試試這個:

Object aDate = new Date(); 
Method aMethod = aDate.getClass().getMethod("getDate", (Class<Void>[]) null); 
Object aResult = aMethod.invoke(aDate, (Void) null); 

您應該添加的try-catch,以確定是否真的有調用一個方法之前GETDATE。

0

如果你不介意額外的依賴,BeanUtils可以爲你做到這一點。