リフレクションを使用するのがかなり新しく、現在フィールドを設定するためにカスタムリフレクションユーティリティを実装しようとしています。 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