![](/img/trans.png)
[英]Java - Reflection. Set value for the class object which are dynamically created
[英]Java - Reflection. Set Value in the setter method multiple argument class object which are dynamically created
我有一个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方法。在运行时可以找到任何东西,例如方法Name方法的Parameter Type,并且具有Parameter Type的顺序。
就我而言,我有一些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,将对象设置为空。如何动态识别设置的顺序。
我的情况我会知道方法参数类型,但必须根据方法参数类型设置默认值。
方法有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;
}
您有一个name1
的setter
,它使用3
字符串作为参数,但是在getBean
方法中,您正在使用m.invoke(obj,"Hello");
调用它m.invoke(obj,"Hello");
,这意味着您试图仅通过一个参数调用名为setName1
的方法,而该方法不存在。
为了说明起见,我将其编辑为m.invoke(obj, "Hello","Hello","Hello");
而且有效。
setAge1
也是setAge1
: m.invoke(obj, 21,21);
目标是,必须为invoke
方法提供的对象数量要比在该方法中声明的参数数量更多
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.