PDA

View Full Version : ...Java Reflection...


ally
31-07-2007, 17:05
...avendo una classe di beans come è possibile visualizzare il contenuto di tutti i suoi elementi per mezzo della reflection?...

...grazie ciao...

andbin
31-07-2007, 17:25
...avendo una classe di beans come è possibile visualizzare il contenuto di tutti i suoi elementi per mezzo della reflection?...Avendo un oggetto Class, usi il metodo getMethods().

Le specifiche JavaBeans stabiliscono come denominare i metodi. Ci saranno quindi dei metodi con nome setXXX, getXXX (o eventualmente isXXX nel caso di proprietà boolean) e per i listener, addXXXListener/removeXXXListener.

A quel punto prendi in considerazione solo i metodi che sono validi secondo le specifiche. Se ad esempio hai una proprietà 'Name' di tipo String, i metodi set/get possono essere:

public void setName (String n)
public String getName ()

PGI-Bis
31-07-2007, 18:42
Usa Introspector (java.beans). Ti fai dare il BeanInfo:

BeanInfo info = Introspector.getBeanInfo(instance.getClass());

e sei a cavallo. Per leggere le proprietà leggi il BeanInfo, ad esempio in un ciclo:

for(PropertyDescriptor pd : info.getPropertyDescriptors()) {
String name = pd.getName();
Object value = pd.getReadMethod().invoke(instance);
}

Dietro le quinte fa quello che ha descritto andbin.

andbin
31-07-2007, 20:34
Usa Introspector (java.beans)Devo ammettere che non conosco questo package. :ops2:
Vedrò di colmare la lacuna.

PGI-Bis
31-07-2007, 20:57
Se ti facessi una lista di quelli che non conosco io finiremmo domattina :D

franksisca
31-07-2007, 22:36
Devo ammettere che non conosco questo package. :ops2:
Vedrò di colmare la lacuna.

Se ti facessi una lista di quelli che non conosco io finiremmo domattina :D

ciao modestia :D:D:D:D

nuovoUtente86
31-07-2007, 22:42
http://www.hwupgrade.it/forum/showthread.php?p=18132516#post18132516

se qualche moderatore vuole unire le discussioni.

PGI-Bis
01-08-2007, 00:46
Sono questioni diverse. Qui interessa più che la riflessione in sè una sua applicazione, che è per altro semplificata da uno strumento ad hoc. Diciamo che è sempre riflessione ma è applicabile solo in certi casi.

All'allegro "ciao modestia" di franksiska rispondo con un altrettanto allegro: qui bisogna volare non bassi ma rasoterra.

Una settimana scrivo una cosa e quella dopo scopro che c'è un altro modo per farla che è due volte più semplice, sicuro e standard. E questo da tempi ormai immemori. Insomma non è modestia, è realismo :cry:

franksisca
01-08-2007, 13:56
Una settimana scrivo una cosa e quella dopo scopro che c'è un altro modo per farla che è due volte più semplice, sicuro e standard. E questo da tempi ormai immemori. Insomma non è modestia, è realismo :cry:

modestia per modesti, io da esperienza personale posso sintetizzare così:

se non so una cosa vengo qua e tu (ti dò del tu) o altri me li risolvete, se io sò una cosa tu la risolvi tipicamente meglio.....:D

spero col tempo di acquistare abbastanza esperienza da poter reggere il confronto anche con quelli come te ;)

e comunque, grazie per le delucidazioni sempre impeccabili ;)

ally
02-08-2007, 11:41
...ottimo grazie...ecco cosa ne è nato...


public static void main(String args[]){

Beans beans = new Beans();

beans.setIntero(1);
beans.setLungo(2);
beans.setStringa("3");

try {
BeanInfo info = Introspector.getBeanInfo(beans.getClass());
PropertyDescriptor[] pd = info.getPropertyDescriptors();

for(int i=0;i<pd.length;i++) {
Method name = pd[i].getReadMethod();
Object value = (Object)pd[i].getReadMethod().invoke(beans, null);
System.out.println(value);
}
} catch (Exception e) {
System.out.println(e);
}


}


...ciao...

PGI-Bis
02-08-2007, 13:37
invoke restituisce un Object. La conversione esplicita da Object a Object (esplicitamente prevista dalle specifiche del linguaggio per una ragione che non ho mai compreso) dovrebbe essere superflua.

(Object)pd[i].getReadMethod().invoke(beans, null);

ally
02-08-2007, 14:13
invoke restituisce un Object. La conversione esplicita da Object a Object (esplicitamente prevista dalle specifiche del linguaggio per una ragione che non ho mai compreso) dovrebbe essere superflua.

(Object)pd[i].getReadMethod().invoke(beans, null);

...si si...è un avanzo di codice di debug....

...grazie ancora...

...ciao...