Ява - Отражение. Установите значение в методе setter объекта класса с несколькими аргументами, которые создаются динамически

Это не ошибка.

Это информация о том, что переменная foo теперь содержит объект класса FooBar, внутреннее имя которого __lldb_expr_12.FooBar. __lldb_expr_12 - это имя модуля Swift на игровой площадке в этом случае.

0
задан sanket jaiswal 9 February 2019 в 09:54
поделиться

2 ответа

Метод принимает 3 аргумента, но вы вызываете метод только с 1 аргументом. Вы должны собрать все значения параметров, а затем вызвать метод.

Вот пример кода.

public static Object getBean(String beanClassName) throws Exception {
    Class klass = Class.forName(beanClassName); // ->Get Class Name By Path
    Object obj = klass.newInstance(); // ->Create The Object of Class
    Method[] b = klass.getDeclaredMethods(); // ->Get Declared Method in
                                                // Class

    for (Method m : b) {
        Type[] pType = m.getGenericParameterTypes();
        if(pType.length==0){
            continue;
        }
        /**
         * Create new array to hold value of parameters
         */
        Object[] params = new Object[pType.length];

        for (int i = 0; i < pType.length; i++) {
            System.out.println("The Arguments :" + pType[i] + " Arguments Order :" + i);
            if (pType[i].equals(String.class)) {
                params[i] = "Hello";

            } else if (pType[i].equals(int.class)) {
                params[i] = 21;                 
            }

        }
        m.setAccessible(true);
        /**
         * Invoke method with all paramtters.
         */
        m.invoke(obj, params);
    }

    return obj;
}
0
ответ дан mfe 9 February 2019 в 09:54
поделиться

У вас есть setter для name1, который принимает 3 строки в качестве параметров, но в вашем методе getBean вы вызываете его динмически, используя m.invoke(obj,"Hello");, это означает, что вы пытаетесь вызвать метод с именем setName1 только с одним параметром, и этот метод не существует.

В целях объяснения я отредактировал его до m.invoke(obj, "Hello","Hello","Hello");, и он работает.

То же самое относится к setAge1: m.invoke(obj, 21,21);

Цель состоит в том, чтобы вы предоставили методу invoke как можно больше объектов, чем количество имеющихся у вас параметров заявлено в методе

0
ответ дан мυѕτавєւмo 9 February 2019 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: