3

次のコードでクラスメンバーとその関連タイプを見つけるためにリフレクションを使用していますが、私の質問は、クラスのデフォルト値を見つける方法があるかどうかです。
たとえば、この場合、値1Lが必要です。

public class SalesOrrP implements Serializable {
    private static final long serialUID = 1L;
}

次のコードを使用して、メンバーの名前とタイプを検索しました

Field[] declaredFields = clsObj.getClass().getDeclaredFields();
for (Field field : declaredFields) {
    // Get member name & types
    Class<?> fieldType = field.getType();
    Type genericType = field.getGenericType();
    String fieldTypeName = fieldType.getName();
    String memberName = field.getName();
    if (genericType instanceof ParameterizedType) {
        ParameterizedType pt = (ParameterizedType) genericType;
        for (Type typeOfReferance : pt.getActualTypeArguments()) {
            //...
        }
    }
}
4

3 に答える 3

3

フィールドの値にアクセスするだけでよい場合は、フィールドにアクセスできるようにして値を取得するだけです。

field.setAccessible(true);
long value = field.getLong(null);
于 2013-02-13T13:14:21.953 に答える
2

静的フィールドの場合、新しいインスタンスを作成する必要はありません。あなたの場合、SalesOrrP.class.getDeclaredField("serialUID").get(null)十分なはずです。

非静的フィールドの場合、クラスのコンストラクター内のコンパイラーによって自動的に再配置されるため、話している初期化値を取得することはできません。これは、探している値を取得するには、クラスの新しいインスタンスを作成する必要があることを意味します。

クラスがnullaryコンストラクター(つまり、引数のないコンストラクター)を提供していることが確実な場合は、次のように実行できます。

public static <T> Map<String, Object> getDefaultValues(Class<T> clazz, T instance) throws Exception {
    Map<String, Object> defaultValues = new HashMap<String, Object>();
    if (instance == null) {
        instance = clazz.newInstance();
    }
    for (Field field : clazz.getDeclaredFields()) {
        field.setAccessible(true);
        Object defaultValue = field.get(instance);
        defaultValues.put(field.getName(), defaultValue);
    }
    return defaultValues;
}

たとえば、あなたの場合、getDefaultValues(SalesOrrP.class, null)はを返し{serialUID=1}ます。クラスのインスタンスがすでにある場合は、(null上記の例ではなく)2番目の引数として指定します。

于 2013-02-13T13:15:17.960 に答える
-1

この最終値は、リフレクションのみで変更できます。リフレクションが使用できないことがわかっている場合は、安全です。

そうでない場合は、新しいインスタンスを作成して、新しいインスタンスの値を取得できます。

于 2013-02-13T13:09:49.200 に答える