我在使用 setter 方法设置类中的每个字段时遇到问题。
对于我的对象类,我有
public class HealthDetails{
private String id;
private String name;
private String age;
private String height;
private String data0;
private String data1;
private String data2;
private String data3;
private String data4;
private String data5;
private String data6;
private String data7;
private String data8;
private String data9;
private String data10;
private String data11;
private String data12;
private String data13;
private String data14;
private String data15;
private String data16;
private String data17;
private String data18;
private String data19;
private String data20;
private String data21;
private String data22;
private String data23;
private String data24;
private String data25;
private String data26;
private String data27;
private String data28;
private String data29;
private String data30;
private String data31;
private String data32;
private String data33;
private String data34;
private String data35;
private String data36;
private String data37;
private String data38;
private String data39;
private String data40;
private String data41;
private String data42;
private String data43;
private String data44;
private String data45;
private String data46;
private String data47;
private String data48;
private String data49;
private String data50;
private String data51;
private String data52;
private String data53;
private String data54;
private String data55;
private String data56;
private String data57;
private String data58;
private String data59;
private String data60;
private String data61;
private String data62;
private String data63;
private String data64;
private String data65;
private String data66;
private String data67;
private String data68;
private String data69;
private String data70;
private String data71;
private String data72;
private String data73;
private String data74;
private String data75;
private String data76;
private String data77;
private String data78;
private String data79;
private String data80;
private String data81;
private String data82;
private String data83;
private String data84;
private String data85;
private String data86;
private String data87;
private String data88;
private String data89;
private String data90;
private String data91;
private String data92;
private String data93;
private String data94;
private String data95;
private String data96;
private String data97;
private String data98;
private String data99;
private String data100;
private String data101;
private String data102;
private String data103;
private String data104;
private String data105;
private String data106;
private String data107;
private String data108;
private String data109;
private String data110;
private String data111;
private String data112;
private String data113;
private String data114;
private String data115;
private String data116;
private String data117;
private String data118;
private String data119;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public String getData0() {
return data0;
}
public void setData0(String data0) {
this.data0 = data0;
}
public String getData1() {
return data1;
}
public void setData1(String data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
public String getData3() {
return data3;
}
public void setData3(String data3) {
this.data3 = data3;
}
public String getData4() {
return data4;
}
public void setData4(String data4) {
this.data4 = data4;
}
public String getData5() {
return data5;
}
public void setData5(String data5) {
this.data5 = data5;
}
public String getData6() {
return data6;
}
public void setData6(String data6) {
this.data6 = data6;
}
public String getData7() {
return data7;
}
public void setData7(String data7) {
this.data7 = data7;
}
public String getData8() {
return data8;
}
public void setData8(String data8) {
this.data8 = data8;
}
public String getData9() {
return data9;
}
public void setData9(String data9) {
this.data9 = data9;
}
public String getData10() {
return data10;
}
public void setData10(String data10) {
this.data10 = data10;
}
public String getData11() {
return data11;
}
public void setData11(String data11) {
this.data11 = data11;
}
public String getData12() {
return data12;
}
public void setData12(String data12) {
this.data12 = data12;
}
public String getData13() {
return data13;
}
public void setData13(String data13) {
this.data13 = data13;
}
public String getData14() {
return data14;
}
public void setData14(String data14) {
this.data14 = data14;
}
public String getData15() {
return data15;
}
public void setData15(String data15) {
this.data15 = data15;
}
public String getData16() {
return data16;
}
public void setData16(String data16) {
this.data16 = data16;
}
public String getData17() {
return data17;
}
public void setData17(String data17) {
this.data17 = data17;
}
public String getData18() {
return data18;
}
public void setData18(String data18) {
this.data18 = data18;
}
public String getData19() {
return data19;
}
public void setData19(String data19) {
this.data19 = data19;
}
public String getData20() {
return data20;
}
public void setData20(String data20) {
this.data20 = data20;
}
public String getData21() {
return data21;
}
public void setData21(String data21) {
this.data21 = data21;
}
public String getData22() {
return data22;
}
public void setData22(String data22) {
this.data22 = data22;
}
public String getData23() {
return data23;
}
public void setData23(String data23) {
this.data23 = data23;
}
public String getData24() {
return data24;
}
public void setData24(String data24) {
this.data24 = data24;
}
public String getData25() {
return data25;
}
public void setData25(String data25) {
this.data25 = data25;
}
public String getData26() {
return data26;
}
public void setData26(String data26) {
this.data26 = data26;
}
public String getData27() {
return data27;
}
public void setData27(String data27) {
this.data27 = data27;
}
public String getData28() {
return data28;
}
public void setData28(String data28) {
this.data28 = data28;
}
public String getData29() {
return data29;
}
public void setData29(String data29) {
this.data29 = data29;
}
public String getData30() {
return data30;
}
public void setData30(String data30) {
this.data30 = data30;
}
public String getData31() {
return data31;
}
public void setData31(String data31) {
this.data31 = data31;
}
public String getData32() {
return data32;
}
public void setData32(String data32) {
this.data32 = data32;
}
public String getData33() {
return data33;
}
public void setData33(String data33) {
this.data33 = data33;
}
public String getData34() {
return data34;
}
public void setData34(String data34) {
this.data34 = data34;
}
public String getData35() {
return data35;
}
public void setData35(String data35) {
this.data35 = data35;
}
public String getData36() {
return data36;
}
public void setData36(String data36) {
this.data36 = data36;
}
public String getData37() {
return data37;
}
public void setData37(String data37) {
this.data37 = data37;
}
public String getData38() {
return data38;
}
public void setData38(String data38) {
this.data38 = data38;
}
public String getData39() {
return data39;
}
public void setData39(String data39) {
this.data39 = data39;
}
public String getData40() {
return data40;
}
public void setData40(String data40) {
this.data40 = data40;
}
public String getData41() {
return data41;
}
public void setData41(String data41) {
this.data41 = data41;
}
public String getData42() {
return data42;
}
public void setData42(String data42) {
this.data42 = data42;
}
public String getData43() {
return data43;
}
public void setData43(String data43) {
this.data43 = data43;
}
public String getData44() {
return data44;
}
public void setData44(String data44) {
this.data44 = data44;
}
public String getData45() {
return data45;
}
public void setData45(String data45) {
this.data45 = data45;
}
public String getData46() {
return data46;
}
public void setData46(String data46) {
this.data46 = data46;
}
public String getData47() {
return data47;
}
public void setData47(String data47) {
this.data47 = data47;
}
public String getData48() {
return data48;
}
public void setData48(String data48) {
this.data48 = data48;
}
public String getData49() {
return data49;
}
public void setData49(String data49) {
this.data49 = data49;
}
public String getData50() {
return data50;
}
public void setData50(String data50) {
this.data50 = data50;
}
public String getData51() {
return data51;
}
public void setData51(String data51) {
this.data51 = data51;
}
public String getData52() {
return data52;
}
public void setData52(String data52) {
this.data52 = data52;
}
public String getData53() {
return data53;
}
public void setData53(String data53) {
this.data53 = data53;
}
public String getData54() {
return data54;
}
public void setData54(String data54) {
this.data54 = data54;
}
public String getData55() {
return data55;
}
public void setData55(String data55) {
this.data55 = data55;
}
public String getData56() {
return data56;
}
public void setData56(String data56) {
this.data56 = data56;
}
public String getData57() {
return data57;
}
public void setData57(String data57) {
this.data57 = data57;
}
public String getData58() {
return data58;
}
public void setData58(String data58) {
this.data58 = data58;
}
public String getData59() {
return data59;
}
public void setData59(String data59) {
this.data59 = data59;
}
public String getData60() {
return data60;
}
public void setData60(String data60) {
this.data60 = data60;
}
public String getData61() {
return data61;
}
public void setData61(String data61) {
this.data61 = data61;
}
public String getData62() {
return data62;
}
public void setData62(String data62) {
this.data62 = data62;
}
public String getData63() {
return data63;
}
public void setData63(String data63) {
this.data63 = data63;
}
public String getData64() {
return data64;
}
public void setData64(String data64) {
this.data64 = data64;
}
public String getData65() {
return data65;
}
public void setData65(String data65) {
this.data65 = data65;
}
public String getData66() {
return data66;
}
public void setData66(String data66) {
this.data66 = data66;
}
public String getData67() {
return data67;
}
public void setData67(String data67) {
this.data67 = data67;
}
public String getData68() {
return data68;
}
public void setData68(String data68) {
this.data68 = data68;
}
public String getData69() {
return data69;
}
public void setData69(String data69) {
this.data69 = data69;
}
public String getData70() {
return data70;
}
public void setData70(String data70) {
this.data70 = data70;
}
public String getData71() {
return data71;
}
public void setData71(String data71) {
this.data71 = data71;
}
public String getData72() {
return data72;
}
public void setData72(String data72) {
this.data72 = data72;
}
public String getData73() {
return data73;
}
public void setData73(String data73) {
this.data73 = data73;
}
public String getData74() {
return data74;
}
public void setData74(String data74) {
this.data74 = data74;
}
public String getData75() {
return data75;
}
public void setData75(String data75) {
this.data75 = data75;
}
public String getData76() {
return data76;
}
public void setData76(String data76) {
this.data76 = data76;
}
public String getData77() {
return data77;
}
public void setData77(String data77) {
this.data77 = data77;
}
public String getData78() {
return data78;
}
public void setData78(String data78) {
this.data78 = data78;
}
public String getData79() {
return data79;
}
public void setData79(String data79) {
this.data79 = data79;
}
public String getData80() {
return data80;
}
public void setData80(String data80) {
this.data80 = data80;
}
public String getData81() {
return data81;
}
public void setData81(String data81) {
this.data81 = data81;
}
public String getData82() {
return data82;
}
public void setData82(String data82) {
this.data82 = data82;
}
public String getData83() {
return data83;
}
public void setData83(String data83) {
this.data83 = data83;
}
public String getData84() {
return data84;
}
public void setData84(String data84) {
this.data84 = data84;
}
public String getData85() {
return data85;
}
public void setData85(String data85) {
this.data85 = data85;
}
public String getData86() {
return data86;
}
public void setData86(String data86) {
this.data86 = data86;
}
public String getData87() {
return data87;
}
public void setData87(String data87) {
this.data87 = data87;
}
public String getData88() {
return data88;
}
public void setData88(String data88) {
this.data88 = data88;
}
public String getData89() {
return data89;
}
public void setData89(String data89) {
this.data89 = data89;
}
public String getData90() {
return data90;
}
public void setData90(String data90) {
this.data90 = data90;
}
public String getData91() {
return data91;
}
public void setData91(String data91) {
this.data91 = data91;
}
public String getData92() {
return data92;
}
public void setData92(String data92) {
this.data92 = data92;
}
public String getData93() {
return data93;
}
public void setData93(String data93) {
this.data93 = data93;
}
public String getData94() {
return data94;
}
public void setData94(String data94) {
this.data94 = data94;
}
public String getData95() {
return data95;
}
public void setData95(String data95) {
this.data95 = data95;
}
public String getData96() {
return data96;
}
public void setData96(String data96) {
this.data96 = data96;
}
public String getData97() {
return data97;
}
public void setData97(String data97) {
this.data97 = data97;
}
public String getData98() {
return data98;
}
public void setData98(String data98) {
this.data98 = data98;
}
public String getData99() {
return data99;
}
public void setData99(String data99) {
this.data99 = data99;
}
public String getData100() {
return data100;
}
public void setData100(String data100) {
this.data100 = data100;
}
public String getData101() {
return data101;
}
public void setData101(String data101) {
this.data101 = data101;
}
public String getData102() {
return data102;
}
public void setData102(String data102) {
this.data102 = data102;
}
public String getData103() {
return data103;
}
public void setData103(String data103) {
this.data103 = data103;
}
public String getData104() {
return data104;
}
public void setData104(String data104) {
this.data104 = data104;
}
public String getData105() {
return data105;
}
public void setData105(String data105) {
this.data105 = data105;
}
public String getData106() {
return data106;
}
public void setData106(String data106) {
this.data106 = data106;
}
public String getData107() {
return data107;
}
public void setData107(String data107) {
this.data107 = data107;
}
public String getData108() {
return data108;
}
public void setData108(String data108) {
this.data108 = data108;
}
public String getData109() {
return data109;
}
public void setData109(String data109) {
this.data109 = data109;
}
public String getData110() {
return data110;
}
public void setData110(String data110) {
this.data110 = data110;
}
public String getData111() {
return data111;
}
public void setData111(String data111) {
this.data111 = data111;
}
public String getData112() {
return data112;
}
public void setData112(String data112) {
this.data112 = data112;
}
public String getData113() {
return data113;
}
public void setData113(String data113) {
this.data113 = data113;
}
public String getData114() {
return data114;
}
public void setData114(String data114) {
this.data114 = data114;
}
public String getData115() {
return data115;
}
public void setData115(String data115) {
this.data115 = data115;
}
public String getData116() {
return data116;
}
public void setData116(String data116) {
this.data116 = data116;
}
public String getData117() {
return data117;
}
public void setData117(String data117) {
this.data117 = data117;
}
public String getData118() {
return data118;
}
public void setData118(String data118) {
this.data118 = data118;
}
public String getData119() {
return data119;
}
public void setData119(String data119) {
this.data119 = data119;
}
}
另一方面,我有一个方法调用setListToPOJO
public class Utility{
public static void setListToPOJO(List<String> objList, HealthDetails healthDetails){
Methods[] methods = healthDetails.getClass().getDeclaredMethods();
int i = 0;
for(Method method : methods){
if(method.getName().startsWith("set"){
method.invoke(healthDetails, objList.get(i++));
}
}
//include all the try catch methods IllegalArgumentException /
//IllegalArgumentException / InvocationTargetException
}
但是我抓住了一个争论类型错过匹配
知道如何在不修改访问字段的情况下解决此问题吗?
这是用于使其工作的方法 主类
public class RunMethod{
public static void main(String[] args){
List<String> data = Arrays.asList("object0", "object1", "object2", "object3", "object4", "object5", "object6", "object7", "object8", "object9", "object10", "object11", "object12", "object13", "object14", "object15", "object16", "object17", "object18", "object19", "object20", "object21", "object22", "object23", "object24", "object25", "object26", "object27", "object28", "object29", "object30", "object31", "object32", "object33", "object34", "object35", "object36", "object37", "object38", "object39", "object40", "object41", "object42", "object43", "object44", "object45", "object46", "object47", "object48", "object49", "object50", "object51", "object52", "object53", "object54", "object55", "object56", "object57", "object58", "object59", "object60", "object61", "object62", "object63", "object64", "object65", "object66", "object67", "object68", "object69", "object70", "object71", "object72", "object73", "object74", "object75", "object76", "object77", "object78", "object79", "object80", "object81", "object82", "object83", "object84", "object85", "object86", "object87", "object88", "object89", "object90", "object91", "object92", "object93", "object94", "object95", "object96", "object97", "object98", "object99", "object100", "object101", "object102", "object103", "object104", "object105", "object106", "object107", "object108", "object109", "object110", "object111", "object112", "object113", "object114", "object115", "object116", "object117", "object118", "object119");
HealthDeatils healthDetails = new HealthDetails();
Utility.setListToPOJO(data,healthDetails);
}
}
下面是输出
错误消息(已编辑(:
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
原因是您传递的参数objList.get(i++)
不是您调用的方法所需的类型。
将代码修改为
for(Method method : methods){
String value = objList.get(i);
try {
if(method.getName().startsWith("set"){
method.invoke(healthDetails, value);
i++;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Value is: " + value); // show which value is wrong
}
}
这将检查哪个值类型是错误的。
另一方面,对于方法的顺序错误。我建议你把objList
从List<String>
改成Map<String, Obj>
,关键是你要调用的方法的名称,比如Id
、Name
。然后,您只需在它前面添加set
来调用它。
for (Map.Entry<String, String> entry : map.entrySet())
{
Object value = entry.getValue();
Method method = healthDetails.getClass().getDeclaredMethod("set"+entry.getKey(), value.getClass());
method.invoke(healthDetails, value);
}
您的 HealthDetails 类有 124 个属性和 124 个 setter 方法,但您只用 120 个元素填充数据列表,导致 ArrayIndexOutOfBoundsException 在通过反射调用 setter 方法时。 如果我们为该列表中的所有 setter 方法提供参数,您的代码将毫无问题地工作。
下面是修改后的工作代码:
public class RunMethod {
public static void main(String[] args) {
List<String> data = Arrays.asList("id", "name", "age", "height", " object0", "object1", "object2", "object3", "object4", "object5", "object6", "object7", "object8", "object9", "object10", "object11", "object12", "object13", "object14", "object15", "object16", "object17", "object18", "object19", "object20", "object21", "object22", "object23", "object24", "object25", "object26", "object27", "object28", "object29", "object30", "object31", "object32", "object33", "object34", "object35", "object36", "object37", "object38", "object39", "object40", "object41", "object42", "object43", "object44", "object45", "object46", "object47", "object48", "object49", "object50", "object51", "object52", "object53", "object54", "object55", "object56", "object57", "object58", "object59", "object60", "object61", "object62", "object63", "object64", "object65", "object66", "object67", "object68", "object69", "object70", "object71", "object72", "object73", "object74", "object75", "object76", "object77", "object78", "object79", "object80", "object81", "object82", "object83", "object84", "object85", "object86", "object87", "object88", "object89", "object90", "object91", "object92", "object93", "object94", "object95", "object96", "object97", "object98", "object99", "object100", "object101", "object102", "object103", "object104", "object105", "object106", "object107", "object108", "object109", "object110", "object111", "object112", "object113", "object114", "object115", "object116", "object117", "object118", "object119");
HealthDetails healthDetails = new HealthDetails();
Utility.setListToPOJO(data, healthDetails);
}
}
实用程序类公共类实用程序{ public static void setListToPOJO(List objList, HealthDetails healthDetails( {
System.out.println(objList.size());
Method[] methods = healthDetails.getClass().getDeclaredMethods();
System.out.println("methods array size " +methods.length);
int i = 0;
for (Method method : methods) {
if (method.getName().startsWith("set")) {
System.out.println(method.getName());
try {
method.invoke(healthDetails, objList.get(i++));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
} }
一种不同的方法。
目前,您的代码为:
Methods[] methods = healthDetails.getClass().getDeclaredMethods();
int i = 0;
for(Method method : methods){
if(method.getName().startsWith("set"){
method.invoke(healthDetails, objList.get(i++));
}
}
这里的隐含假设是:getDeclaredMethods()
返回的 setter 方法与参数 (List<String> objList
( 的顺序相同。
首先,这种假设是错误的。该数组中没有保证的顺序。
但除此之外:当您知道列表中元素的顺序时,您根本不需要使用反射。
你只需要:
for (int i=0; i < objList.size(); i++) {
String parm = objList.get(i);
switch (i) {
case 0: healthDetails.setId(parm); break;
case 1: healthDetails.set...(parm); break;
等等。
关键是,正如多次所述:使用平面列表意味着您(以某种方式(必须知道参数的顺序。然后,您可以简单地使用该顺序来确定所需的二传手方法。
换句话说:您展示的代码示例意味着您不需要使用反射来解决此问题。完全。你使用反射的想法只会给你带来复杂性,没有别的。
(当然:当输入是提供字段名称的Map<String, String>
时,情况就会有所不同。 但只要你使用固定顺序的列表,就没有必要和点使用反射!
鉴于更新,唯一真正的答案是:不要使用名为 data1、data2、...这就是数组/列表的用途。