Отражение Java: получите значение поля, где поле имеет тип интерфейса - PullRequest
3 голосов
/ 18 августа 2011

Скажем, есть класс ( A ), который имеет поле ( myField ).Тип поля myField является интерфейсом ( I ).Все публично.

Мне нужно вызвать метод класса, который является типом * myField *.Мой код следующий:

 Field myField = getField(myClass, "fieldName");
 Class fieldClass = myField.getType(); // returns I

 try {
        Class[] params = {String.class};
        Method method = fieldClass.getMethod("methodName", params);

        Object[] paramsObj = {new String("input")};
        boolean result = (Boolean) method.invoke(WHAT_MUST_I_PUT_HERE, paramsObj);
} catch...

Как видите, проблема в том, что я не могу сделать что-то вроде:

WHAT_MUST_I_PUT_HERE = myField.getClass() // returns Field

Может ли кто-нибудь мне помочь?

РЕДАКТИРОВАТЬ : я пытался использовать

TargetClass o = (TargetClass) myField.get(myClass)

, но обнаружил исключение IllegalArgumentException

Ответы [ 2 ]

7 голосов
/ 18 августа 2011

Первый аргумент метода invoke - это просто объект, для которого вызывается метод. Допустим, вы получили нестатический метод, соответствующий I.m(String). Вам нужен экземпляр I, чтобы вызвать его (поскольку это нестатический метод).

Предположительно, вы хотите вызвать эквивалент myField.m(input) с помощью отражения, поэтому вы просто передаете myField в качестве первого аргумента:

boolean result = (Boolean) method.invoke(myField, paramsObj);
0 голосов
/ 19 августа 2011

Решение:

    Class myClass = service.getClass();
    Field myField = getField(myClass, "fieldName");

    TargetClass target = null;
    try {
        target = (TargetClass) myField.get(service);
    } catch (IllegalAccessException e) {
        e.printStatckTrace();
    }

    Class fieldClass = myField.getType();
    try {
        Class[] params = {String.class};
        Method myMethod = fieldClass.getMethod("methodName", params);

        String paramItem = new String("value");
        Object[] paramsObj = {paramItem};
        boolean result = (Boolean) myMethod.invoke(target, paramsObj);         
    } catch ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...