저는 리플렉션을 사용하는 것에 상당히 익숙하며 현재 필드를 설정하기 위해 사용자 지정 반사 유틸리티를 구현하려고합니다. springboots ReflectionsTestUtils를 살펴보면 setFields가 어떻게 수행되는지에 대한 이해가 약합니다. 현재 매개 변수로 Object 및 ImmutableMap을 사용하여이를 구현하려고합니다.필드를 설정하기위한 사용자 지정 반영 방법
생각은 해시 맵의 필드/키 값을 개체에있는 필드와 비교하는 것입니다. 나는 전반적인 아이디어를 이해하지만 구현하려고 시도한 메소드는 맵에서 필드를 검색하고 객체의 필드를 비교하는 작업이 아닌 것 같습니다.
내 질문 : 아래 구현을 시도한 것보다이를 달성하는 데 더 효과적인 방법이 있습니까? 내가 여기에 올바른 방법을 향하고 모든 팁 주어 감사하겠습니다 경우
확실하지 :
public static void setField(Object object, ImmutableMap<String, Object> map)
throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
if (object instanceof Object) {
Field[] fields = object.getClass().getDeclaredFields();
for (Field aField : fields) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getKey() instanceof Object) {
String value = entry.getKey();
checkPrimitiveValue(aField, object, value);
}
}
}
}
}
private static void checkPrimitiveValue(Field field, Object object, String value) throws IllegalArgumentException, IllegalAccessException {
// Find out Primitive and parse the string to correct value
if (field.getType() == boolean.class) {
field.setAccessible(true);
field.set(object, Boolean.parseBoolean(value));
} else if (field.getType() == long.class) {
field.setAccessible(true);
field.set(object, Long.parseLong(value));
} else if (field.getType() == int.class) {
field.setAccessible(true);
field.set(object, Integer.parseInt(value));
} else if (field.getType() == double.class) {
field.setAccessible(true);
field.set(object, Double.parseDouble(value));
} else { // String is used
field.setAccessible(true);
field.set(object, value);
}
}
질문은? – IEE1394