Вы можете сделать это без необходимости вручную обновлять свой класс каждый раз, когда вы просто меняете поле.
Возможно, вы захотите сделать это, если хотите, чтобы статические члены имели простой доступ к настройкам в приложении, но также хотите сохранить эти настройки.
В этом случае вы также хотели бы иметь возможность применять их по своему усмотрению, а не загружать по умолчанию, так как другие решения здесь необходимы, поскольку они статичны. Это позволяет выполнить откат настроек по понятным причинам.
По сути, используйте методы поля, чтобы получить все члены в классе, а затем сопоставьте полные имена этих полей с содержимым. Полное имя является обязательным, поскольку поле само по себе не сериализуемо. Сериализуйте это сопоставление и восстановите его, чтобы получить сохраненные настройки.
Вторая часть головоломки - это функция apply (). Это проходит через сопоставление и применяет все, что может, к статическому классу.
Вы также должны убедиться, что содержимое статических элементов само по себе сериализуемо.
Как можно надеяться из этого примера класса, статические члены могут быть легко сохранены и возвращены. Я оставлю это на усмотрение разработчика, чтобы он беспокоился об идентификаторах UID классов, мерах защиты и т. Д. IsSameAs () используется для модульного тестирования. AppSettings - это класс, который содержит все статические поля, которые вы хотите сериализовать.
public class AppSettingsReflectorSaver implements Serializable {
HashMap<String, Object> genericNamesAndContents = new HashMap<String, Object>();
private AppSettingsReflectorSaver() {
}
static AppSettingsReflectorSaver createAppSettingsSaver() {
AppSettingsReflectorSaver ret = new AppSettingsReflectorSaver();
ret.copyAppSettings();
return ret;
}
private void copyAppSettings() {
Field[] fields = AppSettings.class.getFields();
for (Field field : fields) {
mapContentsForSerialization(field);
}
}
private void mapContentsForSerialization(Field field) {
try {
Object fieldContents = field.get(AppSettings.class);
genericNamesAndContents.put(field.toGenericString(), fieldContents);
} catch (IllegalArgumentException ex) {
Logger.getLogger(AppSettingsReflectorSaver.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(AppSettingsReflectorSaver.class.getName()).log(Level.SEVERE, null, ex);
}
}
boolean isSameAs(AppSettingsReflectorSaver now) {
for( String thisKey : genericNamesAndContents.keySet()){
boolean otherHasThisKey = now.genericNamesAndContents.containsKey(thisKey);
Object thisObject = genericNamesAndContents.get(thisKey);
Object otherObject = now.genericNamesAndContents.get(thisKey);
boolean otherHasThisValue = thisObject.equals(otherObject);
if (!otherHasThisKey || !otherHasThisValue){
return false;
}
}
return true;
}
void applySavedSettingsToStatic() {
Field[] fields = AppSettings.class.getFields();
for (Field field : fields) {
if (!genericNamesAndContents.containsKey(field.toGenericString())){
continue;
}
Object content = genericNamesAndContents.get(field.toGenericString() );
try {
field.set(AppSettings.class, content);
} catch (IllegalArgumentException ex) {
Logger.getLogger(AppSettingsReflectorSaver.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(AppSettingsReflectorSaver.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
Это мой первый пост - будь осторожен со мной: P ~