cs_tenthor
Messages postés55Date d'inscriptiondimanche 13 novembre 2005StatutMembreDernière intervention29 juin 2007
-
9 mai 2007 à 17:15
cs_tenthor
Messages postés55Date d'inscriptiondimanche 13 novembre 2005StatutMembreDernière intervention29 juin 2007
-
10 mai 2007 à 10:24
Bonjour a tous !
Je développe un bout de code en ce moment, qui utilise l'introspection. J'ai un probleme avec la méthode invoke(Object obj, Object... args).
En fait, au niveau de l'exécution du invoke, j'ai une exception qui générée :
Exception in thread "main" java.lang.NullPointerException
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)
at testAvecIntrospection.Impression.getGestionnaire(Impression.java:86)
...
L'objet Method nommé getGestionnaire n'est pourtant pas null puisqu'il y a un test juste avant.
Par contre l'Object gestionnaire, et le tableau d'arguments sont null. Mais dans la doc java il est dit :
If the number of formal parameters required by the underlying method is
0, the supplied
args
array may be of length 0 or null.
Je suppose donc que le problème vient de gestionnaire. Moi j'avais cru comprendre que le resultat de la méthode invoke aller être mit dans le premier paramètre de invoke, non ?
En fait je crois que je n'ai pas bien compris comment s'utilise la méthode invoke(....)
Quelqu'un pourrait-il me l'expliquer s'il vous plait ?
mais attention ici tu invoke ine méthode de type 'void getGestionnaire()', donc je ne sais pas ce que tu fais dans ta méthode getObjectFromGestionnaire(gestionnaire) mais si ton but et de récupérer le retour de la méthode getGestionnaire (soit avec une signature genre 'Object getGestionnaire()' il te faut changer ton code par :
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 9 mai 2007 à 18:05
Salut,
soit getGestionnaire.invoke(gestionnaire, new Object [] {});
et si tu veux etre propre remplace ta ligne
getGestionnaire = classe.getMethod("getGestionnaire"+METString.premiereLettreMajuscule(champ), null);
par
getGestionnaire = classe.getMethod("getGestionnaire"+METString.premiereLettreMajuscule(champ), new Class[] {});
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
Donc après avoir rajouté les tableaux vides en paramètres (en bleu), j'avais toujours une exception de type NullPointerException qui été générée.
J'ai donc décidé d'instancier la variable gestionnaire avec Object gestionnaire = new Object(); (en rouge).
Mais maintenant j'ai une autre exception qui générée à l'exécution (au niveau de la ligne en vert) :
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)
at testAvecIntrospection.Impression.getGestionnaire(Impression.java:88)
...
Je ne comprend pas trop, j'ai l'impression que l'argument gestionnaire qui est passé en paramètre n'est pas du bon type. Mais pourtant tous les objets héritent de la classe Object, alors je ne comprend pas trop, peut-être que je me trompe encore une fois. Décidément l'introspection n'est pas facile !
Encore une fois merci, et j'attends à nouveau de vos nouvelles pour la suite.
Merci de votre attention,
Tenthor.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_tenthor
Messages postés55Date d'inscriptiondimanche 13 novembre 2005StatutMembreDernière intervention29 juin 20071 10 mai 2007 à 10:24
Ok et un grand merci !!! Ca fonctionne !
En fait la méthode getGestionnaire me renvoi le gestionnaire. En fait j'ai mal compris la doc java ! Je pensais que le résultat de ma méthode getGestionnaire, allait êter mit dans l'objet gestionnaire que je passé en paramètre ! Mais la dic dit pourtant :
* Parameters: : <dd>
obj
- the object the underlying method is invoked from<dd>
args
- the arguments used for the method call
C'est donc moi qui est mal compris ! Voici ce que ca donna maintenant :