PDA

View Full Version : Ancora sulla java.lang.reflect


DesmoColo
28-02-2006, 16:17
Ciao a tutti!
Ho un nuovo problema sui metodi della reflect.

Nella mia applicazione ho un array di stringhe chiamato arrayNomeImmagni;
Vi è inoltre un altro array di stringhe chiamato arrayAttori;

Vorrei che mi aiutasse a capire cosa non va nel seguente Frammento del mio codice:

for(int j = 0; j < arrayAdapter.length;j++){
try{
Class classeAttore = ClassLoader.getSystemClassLoader().loadClass(arrayAttori[j]);//carico una classe che si chiama come la stringa dentro questo array

Method m = classeAttore.getMethod("setImageResourceName",new Class[]{java.lang.String.class});//setIImageResourceName e' un metodo void della classe che ho caricato e che prende in ingresso una stringa
m.invoke(arrayNomeImmagini[j]);//faccio la invoke sul metodo passandogli per parametro un elemento del vettore di stringhe

}
//qui sotto vi sono tutte le eccezioni del caso
catch(ClassNotFoundException cne){
cne.printStackTrace();
}
catch(NoSuchMethodException nsm){
nsm.printStackTrace();
}
catch(IllegalAccessException ia){
ia.printStackTrace();
}
catch(InvocationTargetException it){
it.printStackTrace();
}
}//end ciclo for

Il programma compila senza problemi, ma quando mando in esecuzione il main viene sollevata un eccezione e visualizzato sulla shell il seguente messaggio:
Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

Come mai? Sono sicuro che il metodo setImageResourceName esiste ed e' definito come ho gia detto, inoltre sono sicuro che nell'array di stringhe ci sono elementi non nulli.

pisto
28-02-2006, 17:44
PENSO che il problema sia qui:
Method m = classeAttore.getMethod("setImageResourceName",new Class[]{java.lang.String.class});

se scrivi così il compilatore crea un array che contiene l'array definito con "new Class[]{java.lang.Strinc.class}"

prova a sostituire con Method m=classeAttore.getMethod("setImageResourceName",java.lang.String.class);


P.S.
nel ciclo for c'è un erroretto:
for(int j = 0; j < arrayAdapter.length;j++)
di darà ArrayIndexOutOfBoundException, correggi con
for(int j = 0; j < arrayAdapter.length-1;j++)

DesmoColo
28-02-2006, 23:51
Niente da fare...continua a dare lo stesso errore...

DesmoColo
01-03-2006, 09:50
Ho risolto: la Invoke deve essere fatta su un oggetto di tipo classeAttore (e quindi devo prima crearne un' instanza), per questo non funzionava!

pisto
01-03-2006, 13:56
già, non avevo visto. Ma come mai ti interessa così tanto la reflection?? Io (essendo inesperto e alle prime armi) non ne vedo molti utilizzi pratici, tranne che la gestione di plugin forse...