Как преобразовать объект Java в пару ключ-значение без использования отражения - PullRequest
0 голосов
/ 08 января 2012

Можно ли преобразовать простую Java Object с обычными методами getXXX и setXXX для ее полей в пару ключ-значение, например Map<String, Object>?

Мне нужно это, не полагаясь на отражение Java, поэтому его можно использовать с компилятором Java-To-Javascript, таким как GWT.

Ответы [ 3 ]

3 голосов
/ 08 января 2012

GWT поставляется с механизмом, называемым Deferred Binding в качестве замены для отражения. Хотя обычно этот API используется только при вызове GWT.create(Class<?>), его также можно использовать для написания генераторов кода, которые вызываются во время процесса компиляции GWT (т. Е. Перевод с Java на Javascript).

Вы можете использовать это для создания генератора кода, который будет выводить для любого из ваших классов POJO вспомогательный класс, который будет содержать методы toMap() и fromMap(). GWT предлагает API, который похож на API отражения Java с классами, такими как JClassType, JMethod и т. Д. Они могут использоваться для запроса классов (для которых вы хотите сгенерировать код) для их методов получения и установки и генерирования вышеупомянутые методы соответственно.

Ваш клиентский код будет выглядеть в основном так:

Pojo1 pojo1 = ...;
// Pojo1Transformer is the class that is generated for your domain class Pojo1
Pojo1Transformer pojo1Transformer = GWT.create(Pojo1Transformer.class);
Map<String, Object> pojo1AsMap = pojo1Transformer.toMap(pojo1);
...
pojo1AsMap.put(Pojo1Transformer.NAME, "New Name");
Pojo1 changed = pojo1Transformer.fromMap(pojo1AsMap);
2 голосов
/ 08 января 2012

Я делал это раньше, используя интерфейс MapSerialisation:

interface MapSerialisation {
    Map<String, Object> toMap();
    void fromMap(Map<String, Object>);
}

Реализуйте это на каждом объекте вашей модели и используйте его для перевода.

Другой метод, который я использовалэто трансформеры Google Collections, в которых есть функции преобразования моделей для преобразования между объектом Java и структурой, которая была бы предпочтительна в Javascript.

Хотя я, вероятно, испытал бы искушение использовать Джексона для сериализации в JSON.

0 голосов
/ 08 января 2012

Отражение - наиболее логичный способ сделать это, некоторые могут утверждать, что класс GetMethods / Fields не является полностью техническим отражением.

Один из способов сделать это - реализовать функцию toHash (), где вы можете явно создать Hashtable / Map вашего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...