У меня есть много объектов, определенных в системе, возможно, 1000 объектов, и у некоторых из них есть этот метод:
public Date getDate();
В любом случае я могу сделать что-то вроде этого:
Object o = getFromSomeWhere.....;
Method m = o.getMethod("getDate");
Date date = (Date) m.getValue();
Ответ 1 · рейтинг 13 · Jon Skeet
Если вы можете заставить их все реализовывать интерфейс, это, безусловно, будет лучшим вариантом. Однако отражение также будет работать, и ваш код почти готов:
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 · рейтинг 3 · Azder
Попробуй это:
Object aDate = new Date();
Method aMethod = aDate.getClass().getMethod("getDate", (Class<Void>[]) null);
Object aResult = aMethod.invoke(aDate, (Void) null);
Вы должны добавить try-catch, чтобы определить, действительно ли существует метод getDate перед вызовом.
Ответ 3 · рейтинг 2 · jjnguy
Если есть интерфейс, требующий метода getDate(), вы можете проверить его, используя следующий код:
if (o instance of GetDateInterface){
GetDateInterface foo = (GetDateInterface) o;
Date d = foo.getDate();
}
Ответ 4 · рейтинг 1 · Henrik Paul
Чтобы завершить другие ответы, я бы также определил классы с интерфейсом. Вот как бы я это сделал
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);
}
}