нужна помощь понимание Java Reflection -> Android ParcelableContainer - PullRequest
1 голос
/ 19 февраля 2011

Я играю с платформой Android и пытаюсь глубже погрузиться в Java. Для этого я прочитал о Javas Generics и Reflection API, хотя на самом деле я этого не понимаю. Поскольку я ленивый разработчик;) Я попытался написать «Parcelable-Container», в который я могу поместить ЛЮБОЙ объект, я хочу получить его Parcelable без необходимости повторной реализации этого для каждого объекта с использованием методов Java Reflection.

Я пишу такой метод теста:

public <T> void writeClassInformations(T t){
        Class c = t.getClass();

        System.out.println("DeclaredFields: ");
        for (Field f : c.getDeclaredFields()){
            System.out.println(f.toGenericString());
        }
        System.out.println("Fields: ");
        for (Field f: c.getFields()){
            System.out.println(f.toGenericString());
        }
}

Как я могу получить каждого участника, даже если они являются объектами или частными членами суперкласса? И еще вопрос: вывод такой:

public int hello.test.Testclass.myID

как я могу получить значение myID?


ADD: У меня сейчас серьезные проблемы. Интерфейс Parcelable.Creator заставляет меня написать заявление вроде: public static final Parcelable.Creator CREATOR = new Parcelable.Creator<ParcelableBox<?>>() Можно ли как-нибудь использовать ?? Обычно я использую конструктор типа ParcelableBox(E object). Хотя мне кажется, что я не могу использовать методы Object в ?, я даже не могу передать его в переменную класса, такую ​​как

public ParcelableBox<?> createFromParcel(Parcel source){  
  ...
  return new ParcelableBox<?>(); 
}

или ? myClass, чтобы использовать Reflection на нем. Это конец силы отражения javas? Как я могу получить класс ?

1 Ответ

2 голосов
/ 19 февраля 2011

Отражение следует использовать с осторожностью или не использовать вообще, если этого можно избежать, и особенно не для того, чтобы взломать хорошие принципы дизайна. При этом, это может быть полезно в определенных ситуациях ...

getDeclaredFields может возвращать все типы полей, в то время как getFields возвращает только поля, помеченные как открытые.

Причина, по которой ваш тест возвращает то же самое, заключается в том, что вы используете getDeclaredFields в обоих утверждениях.


how I get the value of 'myID'

Вы можете сделать это только при работе с экземпляром класса. Например,

T t = ...
Field field = t.getClass().getDeclaredField("myID");
field.setAccessible(true);
String value = (String) field.get(t);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...