【问题标题】:Java - Reflection. Set Value in the setter method multiple argument class object which are dynamically createdJava - 反射。在 setter 方法中设置 Value 动态创建的多参数类对象
【发布时间】:2019-02-09 17:54:46
【问题描述】:

我有一个 Bean 类用户,我在运行时动态创建对象。我可以在 setter 方法中设置值,但该 setter 方法有多个参数。

这是我的用户 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 + "]";
    }

我想使用反射调用这个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。我想将每个字符串类型设置为“Hello”,将每个 Int 类型设置为 23,并将对象设置为 Null 如何动态识别要设置的顺序。

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

【问题讨论】:

  • 但我想根据方法参数类型设置值问题是调用正确的设置方法

标签: java spring reflection inversion-of-control


【解决方案1】:

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

【讨论】:

  • 我不能使用对象数组有可能
【解决方案2】:

您有一个setter 用于name1,它以3 字符串作为参数,但是在您的getBean 方法中,您正在使用m.invoke(obj,"Hello"); 动态调用它,这意味着您正在尝试调用一个名为setName1的方法只有一个参数,并且该方法不存在。

出于解释的目的,我将其编辑为m.invoke(obj, "Hello","Hello","Hello");,它可以工作。

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

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

【讨论】:

  • 是 HardCode m.invoke(obj, "Hello","Hello","Hello");
  • 是的,这就是为什么我说它仅用于解释目的
猜你喜欢
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多