[英]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.