編集可能なファイルに設定クラスを保存します。Javaは、私は私のアプリ 例えば、いくつかの設定が含まれているJavaクラスを保存したいこんにちは
class MyConfig {
public int a= 0;
public boolean b= true;
}
そして、私は、このファイルはでは、ユーザーが編集可能にしますJSONSerializerはシンプルなケースでOKです。 しかし、私は何かもっと欲しいです...例えば、将来私はクラスからフィールドを追加/削除したいと思います。 (フィールドが追加されている場合、古いクラスを含むファイルをロードするときにデフォルト値を使用したいと考えています)
私は明確かどうかわかりません... たとえば場合、私は
public String c= "hello";
を追加して(フィールドcの値が含まれていない)ファイルを読み込むことができます。 ありがとうございました!
EDIT:...
public class PropertiesSerializer<T> {
private final Class clDef;
private T obj;
public T get(){ return obj; }
public PropertiesSerializer(Class cl){ //uhm...
if (cl == null) throw new NullPointerException();
clDef= cl;
}
public void init() throws InstantiationException {
Constructor[] ctors = clDef.getDeclaredConstructors();
Constructor ctor = null;
for (int i = 0; i < ctors.length; i++) {
ctor = ctors[i];
if (ctor.getGenericParameterTypes().length == 0)
break;
}
ctor.setAccessible(true);
try {
obj = (T) ctor.newInstance();
} catch (IllegalAccessException e) {
throw new InstantiationException(e.getMessage());
} catch (InvocationTargetException e) {
throw new InstantiationException(e.getMessage());
}
}
public void load(String filename) throws IOException, InstantiationException {
File fl= new File(filename);
Properties props= new Properties();
try (FileReader reader= new FileReader(fl)) {
props.load(reader);
}
init();
for(Field fd: clDef.getFields()){
try {
Object valobj= props.getProperty(fd.getName());
obj.getClass().getField(fd.getName()).set(obj, fd.getType().cast(valobj)); //uhm...
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
public void save(String filename) throws InvalidStateException, IllegalAccessException, IOException {
if(obj == null) throw new InvalidStateException("init wasn't called!");
File fl= new File(filename);
Properties prop= new Properties();
for(Field fd: clDef.getFields()){
prop.setProperty(fd.getName(), String.valueOf(fd.get(obj))); //uhm...
}
try(FileWriter writer = new FileWriter(fl)) {
prop.store(writer, "PropertiesSerializer");
}
}
}
もちろん、私は私のテストクラスを保存することができます
public class TestClass implements Serializable {
public boolean a= true;
//public int i= 1;
}
が、私はそれをロードすることはできません:(: これはI'amがしようとするものです失敗:
スレッド "main"での例外java.lang.ClassCastException:キャストできません java.lang.String to boolean to jav でa.lang.Class.cast(Class.java:3369) net.sf.aldrigo.propertiesSerializer.MainTest.mainでnet.sf.aldrigo.propertiesSerializer.PropertiesSerializer.load(PropertiesSerializer.java:55) ( : sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.javaで sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) でsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)でMainTest.java:17) 43) com.intellij.rt.execution.application.AppMain.mainでjava.lang.reflect.Method.invoke(Method.java:497)で (AppMain.java:144)
これまでに何を試しましたか? –
[java.util.Properties](https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html)と 'storeToXML()'を参照してください。 – markspace
あなたが望むことはできますが、実行時にクラスをコンパイルするたびに実行されます。実行形式でJavaクラスをコンパイルすると、それほど良いアイデアではありません。 –