2013-09-23 4 views
2

Я искал несколько дней о API Reflection в Java. Я хочу получить все объекты из переменной класса Collection внутри переданного объекта.используя отражение для получения объектов из класса коллекции

E.g.

public static <S>void getValue(S s)throws Exception 
{ 
    Field[] sourceFields = s.getClass().getDeclaredFields(); 
    for (Field sf : sourceFields) 
    { 
     boolean sa = sf.isAccessible(); 
     sf.setAccessible(true); 

     String targetMethodName = "get" + source.getName().substring(0, 1).toUpperCase() 
       + (source.getName().substring(1)); 
     Method m = s.getClass().getMethod(targetMethodName, null) ; 
     Object ret = m.invoke(s, new Object[] {}); 

     //ret 
     //check whether it is collection 
     //if yes 
     //get its generic type 
     Type type = f.getGenericType(); 

     //get all the objects inside it 

     sf.setAccessible(sa); 
    } 
} 
+2

Почему вы хотите использовать отражение? Почему простого полиморфизма недостаточно? – Taky

+0

С вашим текущим кодом недостаточно показать, что S может быть коллекцией. Посмотрите на http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html, чтобы увидеть, как ограничить тип S. – brimble2010

+0

S - это всего лишь любой объект, который я хочу получить для каждого поля, включая классы коллекции с их значениями. –

ответ

4

Я думаю, что проблема здесь в том, что ret может быть любой тип коллекции: List, Set, Map, Array, пользовательский класс, который реализует коллекцию. A List может быть ArrayList, LinkedList или любого другого типа List осуществления. Получение содержимого List через отражение не получится. То, что я предлагаю, что вы поддерживаете определенные типы коллекций следующим образом:

Object[] containedValues; 
if (ref instanceof Collection) 
    containedValues = ((Collection)ref).toArray(); 
else if (ref instanceof Map) 
    containedValues = ((Map)ref).values().toArray(); 
else if (ref instanceof Object[]) 
    containedValues = (Object[])ref; 
else if (ref instanceof SomeOtherCollectionTypeISupport) 
    ... 

Тогда вы можете работать с элементами массива.

+0

Этот код является моим последним вариантом, которого я должен был достичь с минимальным количеством жесткого кодирования, насколько это возможно. –

+0

Он говорит '' из переменной класса Collection '' (т. Е. 'Реализует Collection'), поэтому вполне возможно, что большая часть этого не нужна. – Dukeling

+0

Возможно, вы правы, и везде, где OP использует 'collection' вместо' Collection', я пропустил оригинал 'C'. –

3

Collection реализует интерфейс Iterable, поэтому вы можете путешествовать по всем предметам в коллекции и получать их.

Object ref = // something 
if (ref instanceof Collection) { 
    Iterator items = ((Collection) ref).iterator(); 
    while (items != null && items.hasNext()) { 
     Object item = items.next(); 
    // Do what you want 
    } 
} 
Смежные вопросы