2017-09-07 8 views
0

J'ai ce fameux problème concernant IllegalArgumentException, et je n'arrive pas à comprendre pourquoi. Voici ma classe:Incompatibilité de type d'argument: IllegalArgumentException sur un cas simple

public class DataMapper { 
      ... An lot of others methods that does not have the same name (because I created a method specifically for checking this exception 

      private void hello(String ahem) { 
       logger.info("Hey !"); 
      } 
} 

Dans mon cas de test (où je tente d'invoquer ma méthode):

@Test 
    public void test() { 
     Class<?> targetClass = DataMapper.class; 

     try { 
      Object t = targetClass.newInstance(); 

      Class<?>[] cArg = new Class[1]; 
      cArg[0] = String.class; 

      Method method = targetClass.getDeclaredMethod("hello", cArg); 
      method.setAccessible(true); 
      method.invoke(t, cArg); 
     } catch(NoSuchMethodException e) { 
      logger.error("Name does not exist : ", e); 
      Assert.fail(); 
     } catch (Exception e) { 
      logger.error("It is broken : ", e); 
      Assert.fail(); 
     } 
    } 

Il tombe toujours sur un IllegalArgumentException. L'objet Method semble être d'accord avec mes attentes, quoique:

Arguments of the method

My argument's array

Toutes les idées ce qui se passe là-bas? Avant de drapeaux de duplication, je l'ai déjà vérifié ceux-ci, et rien est exactement la même chose, ni fonctionne:

This one construit une liste des méthodes, fait était qu'il avait 2 ou plusieurs méthodes avec le même nom, mais pas les mêmes arguments . The second one était en erreur car il transmettait une chaîne [] comme arguments, et le compilateur faisait une mauvaise interprétation de l'objet pour la liste complète des arguments. The third one était parce qu'il a oublié de passer un argument.

+0

S'il vous plaît inclure le stacktrace de l'exception (et inclure le message d'exception) –

+0

Vous essayez de passer une référence 'class' comme argument à une méthode qui accepte une chaîne' '. Vous devez faire la distinction entre "les types de paramètres utilisés pour trouver la bonne méthode" et "les valeurs d'argument utilisées pour invoquer la méthode". –

+0

Cela a réglé le problème, merci Jon. Je pensais que vous deviez passer des classes à la méthode 'invoke'. –

Répondre

1

Dans cette ligne:

method.invoke(t, cArg); 

Vous devez passer un String comme lieu de cArg qui est un tableau de Class. Quelque chose comme ce qui suit fonctionnera:

method.invoke(t, "Test"); 
+0

Cela a fonctionné, merci! –

+0

De rien. –