现有一个List,里边有1-8条数据,最大8条,最小1条,现在有个实体类,其中有
setN1,setN2,.....setN8,8个方法
我需要把List中的数据取出来,set到这个实体中,当list有一条数据的时候只需要setN1,依次类推,也就是动态控制set的个数。
现在我是通过获取list的大小来控制set的个数,也就是写8个if判断,我觉得这样写不灵活,所以肯请各位给点思路。
setN1,setN2,.....setN8,8个方法
我需要把List中的数据取出来,set到这个实体中,当list有一条数据的时候只需要setN1,依次类推,也就是动态控制set的个数。
现在我是通过获取list的大小来控制set的个数,也就是写8个if判断,我觉得这样写不灵活,所以肯请各位给点思路。
用了的话,难免要if或者switch啊
也就是说class Father是个抽象类,有8个不同的setN方法
再写8个子类Child1 - Child8分别实现其中的一个到8个setN方法
根据list.size()的值,判断应用那个child的类就能保证用了相应个数的setN方法了
要取出SWITCH我看只好请出反射了,将setN方法的调用参数化。
package qujianfeng;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
//楼主所说的实体类
public class TheObject {
//八个属性
private String n1;
private String n2;
private String n3;
private String n4;
private String n5;
private String n6;
private String n7;
private String n8;
public String getN1() {
return n1;
}
/**
* 注意:这是楼主要的关键所在
*/
public void setValues(List list) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Class clazz=this.getClass();
Method method=clazz.getMethod("setN7",new Class[]{java.lang.String.class});
for(int i=0;i<list.size();i++){
method=clazz.getMethod("setN"+(i+1),new Class[]{java.lang.String.class});
//调方法,把list中的值放入对象
method.invoke(this, new Object[]{list.get(i)});
}
}
public void setN1(String n1) {
this.n1 = n1;
}
public String getN2() {
return n2;
}
public void setN2(String n2) {
this.n2 = n2;
}
public String getN3() {
return n3;
}
public void setN3(String n3) {
this.n3 = n3;
}
public String getN4() {
return n4;
}
public void setN4(String n4) {
this.n4 = n4;
}
public String getN5() {
return n5;
}
public void setN5(String n5) {
this.n5 = n5;
}
public String getN6() {
return n6;
}
public void setN6(String n6) {
this.n6 = n6;
}
public String getN7() {
return n7;
}
public void setN7(String n7) {
this.n7 = n7;
}
public String getN8() {
return n8;
}
public void setN8(String n8) {
this.n8 = n8;
}
public String toString() {
StringBuffer sb=new StringBuffer();
sb.append("N1="+getN1());
sb.append(";N2="+getN2());
sb.append(";N3="+getN3());
sb.append(";N4="+getN4());
sb.append(";N5="+getN5());
sb.append(";N6="+getN6());
sb.append(";N7="+getN7());
sb.append(";N8="+getN8());
return sb.toString();
}
//来,大家测试一下效果
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
List list=new ArrayList();
list.add("n1_value");
list.add("n2_value");
list.add("n3_value");
list.add("n4_value");
list.add("n5_value");
list.add("n6_value");
list.add("n7_value");
list.add("n8_value");
TheObject theObject=new TheObject();
theObject.setValues(list);
System.out.println(theObject.toString());
}
}
这是我的思路。
} ;class N1 implements Base{
};class N2 implements Base{
};.......
public Set(List lsObj)
{
for(int i=0,len=lsObj.size();i<len;i++)
{
Base base = (Base)lsObj.get(i);
if(base instance of N1)
{
}
else if(base instance of N2)
{
}
........
}
}
================
package reflect;import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;public class ReflectTest { private String name = null;
private Long salary = null;
public static String[] methodsByOrder = {"setName", "setSalary"};
/**
* @param args
*/
public static void main(String[] args) throws Exception{
List list = new ArrayList();
list.add("malligator");
list.add(new Long(88888));
ReflectTest rt = new ReflectTest();
Class[] argClass = {Object.class};
for (int i = 0; i < methodsByOrder.length; i++) {
if(i >= list.size())
break;
String methodName = methodsByOrder[i];
Method runMethod = ReflectTest.class.getDeclaredMethod(methodName,argClass);
rt.callMethod(runMethod, list.get(i));
}
// display me
rt.display();
}
public void callMethod(Method runMethod, Object obj) throws Exception {
Object[] args = new Object[]{obj};
runMethod.invoke(this, args);
}
public ReflectTest( ) {
}
public void display(){
System.out.println("This is " + this.getClass().getSimpleName()
+ "\n and my field:name = " + name + ", salary = " + salary);
}
public void setName(Object name){
if(name instanceof String)
this.name = (String) name;
// for test
System.out.println("int method->setName" );
}
public void setSalary(Object salary){
if(salary instanceof Long)
this.salary = (Long) salary;
// for test
System.out.println("int method->setSalary" );
} public String getName() {
return name;
} public Long getSalary() {
return salary;
}}