|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
[JAVA] Reflection
Salve a tutti, vi spiego qual'è il mio problema.
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: Codice:
<classeA> <param1>pinco</param1> <param2>pallino</param2> </classeA> 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. Di seguito il mio codice java scritto (premettendo che i metodi di navigazione nel tree xml sono personalizzati, presi da una mia classe funzionante) Codice:
Class c = this.getClass();
Field campo;
for(int i=0; i<xmlroot.size(); i++){
if((campo=c.getField(xmlroot.getElement(i).getTag()))!=null)
campo.set(campo, xmlroot.getElement(i).getValue());
else{
setMailHost("mailhost");
setMyTo("Marco");
}
}
QUalcuno può aiutarmi? Tnx |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Apr 2006
Messaggi: 225
|
Se non hai le già classi e l'XML è correlato di XSD ti conviene usare JAXB che ti crea le classi a partire dall'XSD e puoi a partire dall'XML ottenere una collection di oggetti già valorizzati.
Molto meglio che rifarsi tutto a mano |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2007
Messaggi: 754
|
Codice:
public static void setProperty(String name, Object target, Object value) {
Method metodo = null;
String nameToUpperCase = checkCase(name);
try {
metodo = target.getClass().getMethod("set" + nameToUpperCase, new Class[] {value.getClass()});
}
catch (NoSuchMethodException e) { }
if (metodo != null)
try {
metodo.invoke(target, new Object[] {value});
}
catch (Exception ecc) { }
}
__________________
http://www.tevigroup.it/ |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
Quote:
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
Pur usando questo metodo, cosa dovrei mettere come "value", se alla fine il valore a cui voglio settare il mio parametro lo leggo dall'xml (e lo ottengo tramite xmlroot.getElement(i).getValue()) ?
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
please, nessuno riesce a aiutarmi?!?
tnx |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
Ragazzi sono giunto a una conclusione..pero' non e' il risultato che volevo, vediamo se qualcuno riesce a aiutarmi...
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.. 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
}
}
.....
Codice:
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;
}
Codice:
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;
}
Codice:
ClasseEsempio miaistanza = new ClasseEsempio() Sapete dirmi dove sbaglio? Vi prego aiutatemi |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1551
|
upppp
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:00.




















