2011-07-13 1 views
4

J'ai une classe qui a une méthode comme suit: -IllegalArgumentException lors de l'appel appeler la méthode en utilisant Java Réflexions

public void setCurrencyCode(List<String> newCurrencycode){ 
    this.currencycode = newCurrencycode; 
} 

J'utilise Java Relections pour appeler cette méthode comme suit: -

try { 
    List<String> value = new ArrayList<String>(); 
    value.add("GB"); 

    Class<?> clazz = Class.forName("com.xxx.Currency"); 
    Object obj = clazz.newInstance(); 
    Class param[] = { List.class }; 
    Method method = obj.getClass().getDeclaredMethod("setCurrencyCode", param); 
    method.invoke(value); 
} catch(Exception e) { 
    System.out.println("Exception : " + e.getMessage()); 
} 

Cependant, une exception est levée sur l'appel "invoke": - java.lang.IllegalArgumentException: l'objet n'est pas une instance de la classe déclarante

Des idées?

Merci

Sarah

Répondre

6

cela signifie que le value objet que vous transmettez dans invoke n'est pas une instance de la classe sur laquelle le method est défini. Cela est dû au fait que le premier argument de invoke est l'objet sur lequel fait l'appel, et les arguments suivants sont les paramètres de la méthode invoquée. (Dans ce cas, il semble que la valeur doit être une instance de com.xxx.Currency -. Qui bien sûr ce n'est pas, parce que c'est un List)

Depuis que vous appelez une méthode non statique (et va troubler de créer une nouvelle instance), puis pour l'équivalent de réflexion obj.setCurrencyCode(value), à la fin de votre bloc d'essai, vous aurez besoin d'appeler

method.invoke(obj, value) 

au lieu de votre unique actuel appel à un seul élément.

+0

Fantastique! Je n'avais pas remarqué qu'il y avait plus d'une méthode invoke! Merci de votre aide. –

7

Vous n'êtes pas appeler invoke() correctement: invoke() attend l'objet cible comme premier paramètre, les paramètres à l'appel de méthode que les paramètres suivants (depuis Java 1.5, il est un varargs paramètre)

Essayez ceci:

try 
    { 
     List<String> value = new ArrayList<String>(); 
     value.add("GB"); 

     Class<?> clazz = Class.forName("com.xxx.Currency"); 
     Object obj = clazz.newInstance(); 
     // Since java 1.5, you don't need Class[] for params: it's a varargs now 
     Method method = clazz.getDeclaredMethod("setCurrencyCode", List.class); // you already have a reference to the class - no need for obj.getClass() 
     method.invoke(obj, value); // invoke expects the target object, then the parameters 
    } 
    catch(Exception e) 
    { 
     System.out.println("Exception : " + e.getMessage()); 
    } 
} 
Questions connexes