У меня есть набор классов с любым количеством нестандартных членов - только примитивы, оболочки и т. Д .;некоторые из них могут быть помечены @Encrypted
для обработки по-разному.Все типы реализуют Envelope
.
Я создаю два Map
s (на основе заданного типа), сохраняя «имя поля» (как ключ) и «значение поля» (какзначение).
Проблема в том, что я пытаюсь воссоздать типы снова на основе Map
s.Это то, что я имею до сих пор:
import io.shido.domain.Envelope;
import org.apache.commons.lang3.reflect.FieldUtils;
import java.util.Map;
public final class Factory<T extends Envelope> {
private final Map<String, Object> regularMembers;
private final Map<String, Object> secureMembers;
public Factory(final Map<String, Object> regularMembers, final Map<String, Object> secureMembers) {
this.regularMembers = regularMembers;
this.secureMembers = secureMembers;
}
public T build() {
try {
final ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass(); // This doesn't work >:(
final Class<T> type = (Class<T>) superClass.getActualTypeArguments()[0];
final T result = type.newInstance();
regularMembers.forEach((fieldName, fieldValue) -> assign(result, fieldName, fieldValue));
secureMembers.forEach((fieldName, fieldValue) -> assign(result, fieldName, fieldValue));
return result;
} catch (final Exception e) {
logger.error("Cannot build type based on input parameters due to:", e);
throw new IllegalStateException(e.toString());
}
}
private void assign(final T type, final String fieldName, final Object fieldValue) {
try {
FieldUtils.getField(type.getClass(), fieldName).set(type, fieldValue);
} catch (final IllegalAccessException e) {
e.printStackTrace();
}
}
}
Есть какие-нибудь подсказки, как подойти к этому?Я могу использовать любую библиотеку.
Единственное ограничение, которое у меня есть, это то, что у текущих типов нет сеттеров - и я не могу их добавить, и я использую Java 8
.
Например, это пример:
public final class ExampleType implements Envelope {
@Encrypted
private String first;
private String second;
@Encrypted
private String third;
public ExampleType() { }
public ExampleType(final String first, final String second, final String third) {
this.first = first;
this.second = second;
this.third = third;
}
public String getFirst() { return first; }
public String getSecond() { return second; }
public String getThird() { return third; }
}