Merhaba benim app örneğin bazı yapılandırmasını içeren bir Java sınıfı kaydetmek istiyorum:Java düzenlenebilir bir dosya içine bir yapılandırma sınıfı kaydetmek
class MyConfig {
public int a= 0;
public boolean b= true;
}
Ve ben, bu dosya kullanıcı tarafından düzenlenebilir olmasını istediğiniz İlk bakış JSONSerializer basit bir durum için tamam olabilir. Ama daha fazla bir şey istiyorum ... örneğin geleceğimde sınıfımdan alan eklemek/kaldırmak istiyorum ... ve hala işe yarıyor mu? (Bir alan eklenirse, eski sınıfı içeren dosyayı yüklediğinizde varsayılan değere sahip olmak istiyorum ....)
Net olduğumu bilmiyorum ... örneğin
public String c= "hello";
ekleyebilir ve ardından dosyayı (c alanı için bir değer içermeyen) yükleyebilirim. Teşekkür ederiz!
DÜZENLEME
: bu bi'şey çalışıyor budur: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");
}
}
}
ve tabii ki benim test sınıfını kaydedebilirsiniz
...public class TestClass implements Serializable {
public boolean a= true;
//public int i= 1;
}
ama bunu yükleyemez :(hatası: iplik "ana" java.lang.ClassCastException içinde
İstisna: jav de boolean java.lang.String döküm olamaz net.sf.aldrigo.propertiesSerializer.MainTest.main de a.lang.Class.cast net.sf.aldrigo.propertiesSerializer.PropertiesSerializer.load (PropertiesSerializer.java:55) 'den (Class.java:3369) ( sun.reflect.DelegatingMethodAccessorImpl.invoke de sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62 de sun.reflect.NativeMethodAccessorImpl.invoke0 (Ana Yöntemi)) (DelegatingMethodAccessorImpl.java de MainTest.java:17) : 43) com.intellij.rt.execution.application.AppMain.main de java.lang.reflect.Method.invoke (Method.java:497) en (AppMain.java:144)
Peki, şu ana kadar ne denediniz? –
[java.util.Properties] dosyasına bakın (https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html) ve 'storeToXML()'. – markspace
İstediğinizi yapabilirsiniz, ancak çalışma zamanında sınıfı derlemek için her zaman ve çok iyi bir fikir değil, arama formu java sınıfını çalışma zamanında derleyin –