2017-11-12 1 views
0

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

}

+3

質問は? – IEE1394

答えて

1

テスト:

if (object instanceof Object) 

は、cを除いて無駄です

if (object != null) 

あなたは、オブジェクトのすべてのフィールドにマップ内のすべてのキーを割り当てている:オブジェクトがnullであるASEは、ので、ここでそれを書くためのより良い方法です。あなたがマップ内の値は、文字列(静的な型がオブジェクトである)であることを仮定して渡している、なぜ今、私は得ることはありません

public static void setField(Object object, ImmutableMap<String, Object> map) 
    throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { 
     if (object != null) { 
      Field[] fields = object.getClass().getDeclaredFields(); 

      for (Field aField: fields) { 
       Object value = map.get(aField.getName()); 
       assignValue(aField, object, value); 
      } 
     } 
    } 

:私はあなたのような何かをやってみたかったと思います。プリミティブ型の

private static void assignValue(Field field, Object object, Object value) 
    throws IllegalArgumentException, IllegalAccessException, 
      NoSuchFieldException, SecurityException { 
    field.setAccessible(true); 
    if (field.getType().isPrimitive()) 
     if (value == null) { 
      value = defaultValue(field.getType()); 
     } else if (value instanceof String) { 
      value = parseValue(field.getType(), (String)value); 
     } 
    } 
    field.set(object, value); 
} 

デフォルト値:

:プリミティブ型(あなたがそれをやっている理由は、私は得ることはありませんが、ここにある)への文字列から

private static Object defaultValue(Class<?> clazz) { 
    if (clazz == boolean.class) { 
     return Boolean.FALSE; 
    } else if (clazz == char.class) { 
     return (char)0; 
    } else if (clazz == byte.class) { 
     return (byte)0; 
    } else if (clazz == short.class) { 
     return (short)0; 
    } else if (clazz == int.class) { 
     return 0; 
    } else if (clazz == long.class) { 
     return 0L; 
    } else if (clazz == float.class) { 
     return 0F; 
    } else if (clazz == double.class) { 
     return 0.0; 
    } else { 
     throw new IllegalArgumentException("Not a primitive type"); 
    } 
} 

コンバージョン

private static Object parseValue(Class<?> type, String s) { 
    if (type == boolean.class) { 
     return Boolean.valueOf(s); 
    } else if (type == char.class) { 
     return (char)Integer.parseInt(s); 
    } else if (type == byte.class) { 
     return Byte.valueOf(s); 
    } else if (type == short.class) { 
     return Short.valueOf(s); 
    } else if (type == int.class) { 
     return Integer.valueOf(s); 
    } else if (type == long.class) { 
     return Long.valueOf(s); 
    } else if (type == float.class) { 
     return Float.valueOf(s); 
    } else if (type == double.class) { 
     return Double.valueOf(s); 
    } else { 
     throw new IllegalArgumentException("Not a primitive type"); 
    } 
} 
関連する問題