IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Method.getParameterTypes retourne le mauvais type


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut Method.getParameterTypes retourne le mauvais type
    Bonjour,
    j'ai un problème que je trouve pour le moins inusité. J'essaie d'avoir accès à une méthode d'une classe qui est inconnu qui dépend d'un code entré par l'utilisateur du programme. J'utilise donc quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    thisClass = cl.loadClass(className);
    fn = thisClass.getDeclaredMethod(functionName, pars);
    Cependant, j'ai toujours la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     java.lang.NoSuchMethodException: afi.scenario.actions.IDMEFAction.idmef_complete(java.lang.Long, java.lang.String, java.lang.String, java.lang.String, java.lang.Long, afi.scenario.parser.time.TimeStamp, java.lang.String, java.lang.String)
    Cependant, cette classe et cette méthode existe. Donc, après quelque test, je me suis rendu compte qu'en printant le type des paramètres de la méthode idmef_complete(...), tous les paramètres étaient des "class java.lang.String". Simplement par curiosité, j'ai changé ma classe idmef_complete(...) pour mettre seulement des String en paramètres et comme ça, ça marche. Cependant, j'aurais vraiment besoin de mon TimeStamp et du cpu (à la limite, l'autre long peu être mis de côté). La seule méthode idmef_complete est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	public void idmef_complete(long priority,String description,String traceName,String processName,long cpu,
    			TimeStamp creationTime,String type,String channel)
    Au fait, j'ai déjà fait un "Clean all" + "Build all" afin que toutes les classes du code source concorde avec le runtime.
    Merci pour votre aide!

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Attention à ne pas confondre long et Long (avec ou sans majuscule.)

    Avec la majuscule, c'est java.lang.Long, le type objet qui sert à wrapper le type de base long.

    Sans la majuscule, c'est le type de base. Ce n'est pas un type objet. C'est différent. Pour dire à getMethod() que c'est celui-là qu'on veut, on met Long.TYPE, qui a été créé justement pour faire ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut
    Malheureusement, le problème persiste. Comme je l'ai mentionné, j'ai fait printer avec le code ci-dessous et les types de la fonction idmef_complete(...) retourne neuf fois "class java.lang.String".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i = 0; i<thisClass.getMethods().length; i++) {
    	if(thisClass.getMethods()[i].getName().equals("idmef_complete")) {
    	    for(int j=0; j < thisClass.getMethods()[i].getParameterTypes().length;j++)
    		System.out.println(thisClass.getMethods()[i].getParameterTypes()[i].toString());
        }
    }
    J'ai aussi changé ma fonction idmef_complete(...) pour que les paramètres soit les mêmes que ceux retourner en erreur soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idmef_complete(java.lang.Long priority, java.lang.String description, java.lang.String traceName, java.lang.String process, java.lang.Long cpu, afi.scenario.parser.time.TimeStamp creationTime, java.lang.String type, java.lang.String channel)
    et je reçois une nouvelle erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    java.lang.IllegalArgumentException: argument type mismatch
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:616)
    ...
    Si je comprends bien, lorsque j'appelle invoke(x,y);, x n'est pas une instance de la class. Je vais regarder ceci de plus près et je vous en donne des nouvelles. Merci

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par maxi297 Voir le message
    Malheureusement, le problème persiste. Comme je l'ai mentionné, j'ai fait printer avec le code ci-dessous et les types de la fonction idmef_complete(...) retourne neuf fois "class java.lang.String".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i = 0; i<thisClass.getMethods().length; i++) {
    	if(thisClass.getMethods()[i].getName().equals("idmef_complete")) {
    	    for(int j=0; j < thisClass.getMethods()[i].getParameterTypes().length;j++)
    		System.out.println(thisClass.getMethods()[i].getParameterTypes()[i].toString());
        }
    }
    Essaie plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(Method method : thisClass.getMethods()) {
      if(method.getName().equals("idmef_complete")) {
        for(Class<?> type : method.getParameterTypes()) {
          System.out.println(type.toString());
        }
      }
    }
    Ça t'évitera de te planter dans les index -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut
    Ahah! Effectivement, il y a de quoi être découragé. Il faut m'excuser alors. Merci pour toute l'aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retourner un tableau (type list) dans une methode
    Par jeanjean6 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/04/2010, 16h30
  2. Retourner *proprement* un type string
    Par supernoob dans le forum C++
    Réponses: 17
    Dernier message: 11/09/2006, 22h24
  3. [split]methode non définie pour le type string
    Par maniolo dans le forum Langage
    Réponses: 12
    Dernier message: 12/04/2006, 16h59
  4. methode qui retourne une liste d'objets du meme type
    Par anoukhan dans le forum Oracle
    Réponses: 8
    Dernier message: 12/01/2006, 18h38
  5. Champs de mauvais type
    Par sebos63 dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/06/2004, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo