IllegalArgumentException при вызове метода invoke с использованием Java Reflections - PullRequest
4 голосов
/ 13 июля 2011

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

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: объект не является экземпляром объявления класса

Любые идеи?

Спасибо

Сара

Ответы [ 2 ]

7 голосов
/ 13 июля 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() );
    }
}
6 голосов
/ 13 июля 2011

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

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

method.invoke(obj, value)

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

...