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

У меня есть класс Bean User. Я динамически создаю объект во время выполнения. Я могу установить значение в методе setter, но у этого метода set есть несколько аргументов.

Это класс пользователя My Bean

 public class User {

     private String name1;
     private String name2;
     private String name3;
     private int age1;
     private int age2;


     public String getName1() {
        return name1;
    }
    public void setName1(String name1,String name2,String name3) {
        this.name1 = name1;
        this.name2 = name2;
        this.name3 = name3;
    }

    public int getAge1() {
        return age1;
    }
    public void setAge1(int age1,int age2) {
        this.age1 = age1;
        this.age2 = age2;
    }

    @Override
    public String toString() {
        return "StudentUser [name1=" + name1 + ", name2=" + name2 + ", name3=" + name3 + ", age1=" + age1 + ", age2="
                + age2 + "]";
    }

Я хочу вызвать этот метод установки, используя отражение. Я могу найти что-нибудь во время выполнения, например, метод Name, метод Parameter Type, а также иметь порядок типа Parameter.

для моего случая у меня есть некоторый набор значений по умолчанию для метода сеттера, таких как примитивный тип и не примитивный тип, я нахожу тип аргументов метода во время выполнения и вызываю метод сеттера и устанавливаю для них значения по умолчанию

Мой основной метод: -

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

            for(int i=0;i<pType.length; i++)
            {

                 System.out.println("The Arguments :"+pType[i]+" Arguments Order :"+i);
                   if(pType[i].equals(String.class))
                   {
                        m.setAccessible(true);
                        m.invoke(obj,"Hello");
                   }
                   else if(pType[i].equals(int.class))
                   {

                       System.out.println("Machted int");
                       m.setAccessible(true);
                       m.invoke(obj,21);
                   }

            }
        }

        return obj;
    }

Я могу сделать это, у меня есть исполняемая функция ArgumentMissMacth. Я хочу установить для каждого типа строки значение «Hello», а для каждого типа Int - 23 и «Object to Null». Как можно динамически определить порядок установки.

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

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

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

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

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

0 голосов
/ 16 января 2019

Метод принимает 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;
}
...