Ok, vediamo questo "passettino" piccolo, ovvero invocare per reflection un metodo:Originariamente inviato da byanto
a questo punto dovrei eseguire un metodo e credo si usi "invoke();" ma non so come....
mi puoi scrivere un esempio... di
metodo.invoke() ; mi dice che () non va bene, ma in mezzo cosa ci passo?
Dal Class devi intanto ottenere un Method. Puoi prendere una lista dei metodi (vedi i metodi di Class che restituiscono un Method[]) e cercare quello che ti serve in base a dei criteri oppure puoi voler andare a colpo sicuro sapendo a priori il nome e quantità/tipi dei parametri.
In quest'ultimo caso puoi usare:
Method getMethod(String name, Class[] parameterTypes)
che si aspetta di trovare un metodo pubblico con nome e tipi dei parametri specificati. Attenzione! I Class che indichi devono essere precisi per quanto riguarda la distinzione tra i primitivi e le classi "wrapper" (Integer, Long, ecc...).
Cioè specificare come Class ad esempio int.class oppure Integer.class è differente.
per un metodo es.:
void pippo(String x, int y)
dovrai usare:
Method m = c.getMethod("pippo", new Class[] { String.class, int.class });
Se il secondo parametro fosse Integer (e non int!), allora bisogna mettere Integer.class.
Una volta ottenuto un Method lo puoi invocare. Method ha un invoke() che si aspetta dei parametri.
Il primo è l'oggetto su cui deve essere invocato, ma solo se è di "istanza". Se fosse un metodo statico, non c'è oggetto e va passato un null.
Se è un metodo di istanza, prima di questo passo dovresti ottenere una istanza della classe dal Class.
Poi invoke si aspetta un array di parametri. Qui in questo caso non c'è distinzione tra tipi primitivi e relativi wrapper. L'array è di Object, un int va comunque passato come Integer.
Quindi es.:
m.invoke(laIstanza, new Object[] { "blabla", new Integer(123) });
Da Java 5 c'è l'autoboxing, basterebbe passare direttamente 123 (o una variabile int).