2013-08-12 5 views
1

Этот вопрос касается отражения java.Как выполнить итерацию по возврату вызова invoke()?

  1. У меня есть петля с методом внутри. m изменяется с каждой итерацией.
  2. m возвращает массив некоторого типа, который тоже изменяется (потому что у нас есть новый метод для каждой итерации цикла).
  3. Мне нужно перебирать каждый тип и вызывать метод с именем getRetVal().

код выглядит следующим образом:

for(Object ro: m.invoke(argList[0]) 
    { 
     getRetValMethod = ro.getClasss().getMethod("getRetVal", null); 
     Object co = getRetValMethod.invoke(null); 
     .... 

Проблема, взывать возвращает тип объекта, который не суммируется и не имеют итератор

+0

затем отбросил объект до ожидаемого ... –

+0

Вы говорите, что 'm' каждый раз меняет цикл' for', который вы разместили? Или каждый раз через какой-то другой цикл, который включает в себя код, который вы отправили в теле? –

+0

это для цикла в другом цикле, который не показан. Это для цикла заставляет m изменять каждую итерацию цикла THAT. Поэтому каждый раз мы получаем новый метод, и мы вызываем тот метод, который возвращает массив некоторого типа. Поскольку мы называем разные методы, мы получаем массивы разных типов. Надеюсь, это прояснит ситуацию. –

ответ

0

Вы можете просто бросить в Iterable<?>:

Iterable<?> iterable = (Iterable<?>) m.invoke(argList[0]); 
for (Object x : iterable) { 
    ... 
} 

EDIT: Теперь вы сказали, что это всегда массив ссылочного типа, вместо этого вы можете использовать вместо Object[]:

Object[] array = (Object[]) m.invoke(argList[0]); 
for (Object x : array) { 
    ... 
} 

Если вам нужно обрабатывать оба случая, вы можете использовать instanceof, чтобы проверить, какой путь, чтобы идти вниз (или ни).

+0

invoke возвращает тип объекта. Во время выполнения он всегда является массивом некоторого ссылочного типа. Когда я пытаюсь выполнить свой код, я получаю «ClassCastException: myReferenceType: не может быть передан в java.lang.Iterable». –

+0

@HukeLau_DABA: Ах, ты не сказал, что это массив. В этом случае вместо этого наберите 'Object []'. Будет редактировать. –

Смежные вопросы