Java - 反思。在 setter 方法中设置值 多参数 class 动态创建的对象

Java - Reflection. Set Value in the setter method multiple argument class object which are dynamically created

我有一个 Bean class 我在 运行 time.I 期间动态创建对象的用户可以在 setter 方法中设置值,但是 setter 方法有多个参数。

这是我的用户 Bean Class

 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 + "]";
    }

我想使用 reflection.I 调用此 setter 方法可以在 运行 时间内找到任何东西,例如方法名称方法参数类型以及参数类型的顺序。

对于我的情况,我有一些 setter 方法的默认值集,例如原始类型和非原始类型,并在 运行 时间内找到方法参数类型并调用 setter 方法并为它们设置默认值

我的主要方法:-

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.I 想将每个字符串类型设置为 "Hello" 并将每个 Int 类型设置为 23 并将对象设置为 Null 如何动态识别要设置的顺序。

我的情况我会知道方法参数类型但必须根据方法参数类型设置默认值。

方法有 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;
}

您有一个 name1setter3 字符串作为参数,但是在您的 getBean 方法中,您使用 [=14= 动态调用它],这意味着您正在尝试调用一个名为 setName1 的方法,只有一个参数,而这个方法不存在。

出于解释的目的,我将其编辑为 m.invoke(obj, "Hello","Hello","Hello"); 并且它有效。

setAge1 也是如此:m.invoke(obj, 21,21);

目标是,您必须向 invoke 方法提供与您在方法中声明的参数数量一样多的对象