Java Вопрос, как получить значение метода от неизвестного объекта - PullRequest
1 голос
/ 28 апреля 2009

У меня есть много объектов, определенных в системе, возможно, 1000 объектов, и некоторые из них имеют этот метод:

public Date getDate();

В любом случае, я могу сделать что-то вроде этого:

Object o = getFromSomeWhere.....;

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

Ответы [ 5 ]

12 голосов
/ 28 апреля 2009

Если вы можете заставить их всех реализовать интерфейс, это, безусловно, будет лучшим вариантом. Тем не менее, отражение также будет работать, и ваш код был почти там:

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();
    }
}
3 голосов
/ 28 апреля 2009

Попробуйте это:

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

Вы должны добавить try-catch, чтобы определить, действительно ли существует метод getDate перед вызовом.

2 голосов
/ 28 апреля 2009

Если есть интерфейс, требующий метода getDate (), вы можете проверить, используя следующий код:

if (o instance of GetDateInterface){
    GetDateInterface foo = (GetDateInterface) o;
    Date d = foo.getDate();
}
1 голос
/ 28 апреля 2009

Чтобы завершить другие ответы, я бы также идентифицировал классы с интерфейсом. Вот как бы я это сделал

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);
  }
}
0 голосов
/ 28 апреля 2009

Если вы не против дополнительной зависимости, BeanUtils может сделать это для вас.

...