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:
metodo java:codice:<classeA> <param1>pinco</param1> <param2>pallino</param2> </classeA>
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).codice:Pseudocodice 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.
quindi questo e' il codice che vorrei utilizzare (ma che non funziona, nel senso pare non modifichi un bel niente..
dove getItem e'codice: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 }); OPPURE campo.set(item, stringa); dovrebbe fare la stessa cosa che metodo.invoke, ossia modificarmi il campo } } .....
e checkCasecodice: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; }
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 esempiocodice: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; }
e ai metodi "metodo.invoke" o "campo.set" passo "miaistanza" invece che "item", cosi' funziona perfettamente, e mi modifica i campi che voglio..codice:ClasseEsempio miaistanza = new ClasseEsempio()
Sapete dirmi dove sbaglio?
please help me :'(

Rispondi quotando
...il programma ha sempre funzionato, ero io che lo testavo male eheheh.