Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [JAVA] Reflection

  1. #1

    [JAVA] Reflection

    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:
    codice:
    <classeA>
       <param1>pinco</param1>
       <param2>pallino</param2>
    </classeA>
    metodo java:
    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.
    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..
    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
                              }
                    }
    
    
    .....
    dove getItem e'
    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;
       }
    e checkCase
    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;
            }
    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

    codice:
     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 :'(

  2. #2
    up

  3. #3
    Ho dato una rapida occhiata al codice. Concettualmente la logica che scrivi va bene, ma ti consiglio di isolare meglio ogni compito tramite funzioni specifiche.

    Se dai un'occhiata all'articolo sulla Reflection che ho scritto qlc tempo fa (http://java.html.it/articoli/leggi/2...ction-in-java/) puoi vedere una classe concreta che ho utilizzato per gestire alcuni metodi.

    Da quanto vedo, quello che ti serve e' un metodo set su un oggetto che a tempo di compilazione non conosci. Prova ad utilizzare questo metodo:

    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) { }
    }

    Passi l'oggetto, il nome del metodo ed il valore da settare.

    Fammi sapere.
    Saluti,
    Pasquale Congiustì.

  4. #4
    Ma l'oggetto "target" cosa sarebbe? Da quello che ho capito dovrebbe essere un'istanza della classe all'interno della quale c'e' il campo che voglio utilizzare, giusto?
    Dunque ammettendo di non conoscere a priori il nome di tale classe, ma leggendolo dal tag root del mio file xml, come recupero tale classe, e in che modo dovrei passarla a setProperty?

    Ti mostro come ho fatto io (ma non funziona, nel senso che non mi modifica i campi:
    codice:
    Object item = this.getItem(xmlroot.getTag());  //xmlroot.gettag() mi restituisce il nome della classe sulla quale voglio agire, e getItem mi restituisce "actualItem = Class.forName(className).newInstance();"
    
    quindi dovrei usare setProperty cosi'
    
    setProperty(nomeMetodo, item, valore)
    Beh, se cosi' fosse posso gia' dirti che non funziona...mentre funziona passando invece di item(=Class.forName(className).newInstance()) un'istanza della mia classe (Miaclasse istanza = new Miaclasse())...
    Ma in tal modo non risulta + utile per il mio scopo perche' dovrei conoscere gia' a livello di programmazione il nome della classe sulla quale lavorare, mentre in realta' tale nome lo conoscero' a runtime..

    Confido in un suo aiuto,

    Grazie in anticipo

  5. #5
    Dunque, quello che fai e' corretto (almeno a livello teorico). Il metodo getItem(...) carica a runtime una classe e poi il metodo setProperty(...) ne setta una proprieta'. Da quello che ho capito non viene settato nessun valore, giusto? oppure viene restituito qualche errore specifico?

    Perche' se getItem non fallisce e nemmeno setProperty nemmeno allora deve per forza effettuare l'operazione di set. Fai cosi', solleva l'eccezione nel metodo setProperty

    ...
    catch (Exception ecc) {
    ecc.printStackTrace();
    }
    }

    Cosi' vediamo se fallisce o meno (e che errori ti da).
    Saluti,
    Pasquale Congiustì.

  6. #6
    ehm...mi spiace averti fatto perdere tempo..ma ho trovato l'errore..
    ..o meglio il non errore...il programma ha sempre funzionato, ero io che lo testavo male eheheh.

    Grazie ugualmente per il supporto, e alla prossima!

  7. #7
    Fa nulla, importante e' che alla fine tutto funzioni correttamente

    Ciao.
    Saluti,
    Pasquale Congiustì.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.