IllegalArgumentException при вызове метода вызова с использованием отражений Java

У меня есть класс, который имеет следующий метод: -

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

Я использую Java Relections для вызова этого метода следующим образом:

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() );
}

Однако при вызове «invoke» возникает исключение: — java.lang.IllegalArgumentException: объект не является экземпляром объявляющего класса

Любые идеи?

Спасибо

Сара


person Sarah Rushworth    schedule 13.07.2011    source источник


Ответы (2)


Это означает, что объект value, который вы передаете в invoke, не является экземпляром класса, в котором определен method. Это связано с тем, что первый аргумент вызова — это объект, для которого выполняется вызов, а последующие аргументы — это параметры вызываемого метода. (В этом случае похоже, что значение должно быть экземпляром com.xxx.Currency, что, конечно же, не так, потому что это List.)

Поскольку вы вызываете нестатический метод (и собираетесь создать новый экземпляр), то для рефлексивного эквивалента obj.setCurrencyCode(value) в конце вашего блока try вам нужно будет вызвать

method.invoke(obj, value)

вместо вашего текущего одиночного вызова с одним аргументом.

person Andrzej Doyle    schedule 13.07.2011
comment
Фантастика! Я не заметил, что было более 1 метода вызова! Спасибо за вашу помощь. - person Sarah Rushworth; 13.07.2011

Вы не вызываете invoke() правильно: invoke() ожидает целевой объект в качестве первого параметра, затем параметры вызова метода в качестве следующих параметров (начиная с java 1.5, это параметр varargs)

Попробуй это:

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() );
    }
}
person Bohemian♦    schedule 13.07.2011