Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Java Вопрос, как получить значение метода из неизвестного объекта

Автор вопроса: jojoОтветов: 5

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

public Date getDate();

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

Object o = getFromSomeWhere.....;

Method m = o.getMethod("getDate");
Date date = (Date) m.getValue();
  • Есть ли интерфейс, реализуемый этими объектами для получения метода getDate()? jjnguy 28.04.2009
  • Если есть интерфейс, то просто без использования отражения вы можете использовать оператор instanceof перед приведением к этому интерфейсу. Azder 28.04.2009
  • нет интерфейса или того же родительского класса, поэтому я должен делать отражение.... jojo 28.04.2009
  • Потому что, если нет единого типа, который определяет метод и в который вы можете привести все объекты, отражение - единственный способ получить дескриптор метода. Rytmis 28.04.2009

javadynamicmethods

Ответы

Ответ 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);
  }
}

Ответ 5 · sproketboy

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы