Salve a tutti, devo creare un metodo generico che leggendo da un file xml degli elementi, ricerchi all'interno della classe xxx se sono presenti tali parametri e me li cambi secondo il valore corrispondente all'elemento sul file xml.
vi faccio un esempio
XML file:
<classeA>
<param1>pinco</param1>
<param2>pallino</param2>
</classeA>
metodo java:
[b]Pseudocodice[/b]
Ciclo sul file XML
Leggo il tag di ogni elemento
Cerco nella classe java che voglio modificare se esiste un parametro uguale al tag dell'elemento cercato sul file xml.
Se c'è modifico il valore di tale parametro con quello letto nell'xml.
Mi è stato consigliato di usare Java.Reflection, dunque, volendo creare una classe di inizializzazione di queste variabili (che leggerei da xml) vorrei non dover sapere a priori il nome della classe su cui voglio lavorare (deve poterla leggere sempre dall'xml e sara' per l'appunto il tag root del mio xml).
quindi questo e' il codice che vorrei utilizzare (ma che non funziona, nel senso pare non modifichi un bel niente..
Class c = Class.forName(prefix+"."+checkCase(xmlroot.getTag()));
Object item = this.getItem(xmlroot.getTag());
Method metodo = null;
String stringa;
for(int i=0; i<xmlroot.size(); i++){
if((campo=c.getField(xmlroot.getElement(i).getTag()))!=null)
{
stringa = xmlroot.getElement(i).getValue();
metodo = c.getMethod("set" + checkCase(xmlroot.getElement(i).getTag()),new Class[] { stringa.getClass() });
metodo.invoke(item, new Object [] { stringa });
[b]OPPURE[/B]
campo.set(item, stringa); [i]dovrebbe fare la stessa cosa che metodo.invoke, ossia modificarmi il campo[/i]
}
}
.....
dove getItem e'
public Object getItem(String table) {
String className = "MIOPATH." + checkCase(table);
Object actualItem = null;
try {
actualItem = Class.forName(className).newInstance();
System.out.println(actualItem.getClass().getName());
} catch(Exception ecc) {
System.out.println(ecc.toString());
}
return actualItem;
}
e checkCase
public String checkCase(String name) {
char firstLetter = name.charAt(0);
if(Character.isLowerCase(firstLetter)) {
name = name.substring(1,name.length());
name = Character.toString(firstLetter).toUpperCase() + name;
}
return name;
}
In questo modo quando vado a verificare se mi ha effettivamente modificato i campi voluti, vedo che in realta' sono memorizzati come per default, quindi pare non li abbia toccati..Se pero' istanzio una oggetto della classe sulla quale voglio lavorare, per esempio
ClasseEsempio miaistanza = new ClasseEsempio()
e ai metodi "metodo.invoke" o "campo.set" passo "miaistanza" invece che "item", cosi' funziona perfettamente, e mi modifica i campi che voglio..
Sapete dirmi dove sbaglio?
please help me :'(