1.问题:
遍历一个数组,每当匹配到一个参数XXX,都要使用相应的c.setXXX()方法,如果参数一多,人工敲代码肯定很麻烦,你会怎么办?
for(String nodename:ThirdNode) { if(c.getNodeName().equals("title")) x.setTitle((c.getTextContent())); if(c.getNodeName().equals("price")) x.setPrice((c.getTextContent())); if(c.getNodeName().equals("author")) x.setAuthor((c.getTextContent())); ...... }
2.解决方法:反射
以price属性为例:
2.1.得到属性名price,就是nodename
2.2得到方法名setPrice,将price拆分成p 和rice,将p变成大写P 然后P和rice得到Price,再用StringBuilder加上前缀set,最终得到属性名setPrice
2.3调用对应对象c的setPrice()方法
代码如下,测试通过.
for(String nodename:ThirdNode)
{
if(c.getNodeName().equals(nodename)) //nodename就是要匹配的属性,可能有很多个
{
String s1=nodename.substring(0, 1); //先得到nodename属性的第一个字符,目的是变成大写
String s2=nodename.substring(1); //得到后半部分子串
StringBuilder str=new StringBuilder(""); //创建StringBuilder对象
str=str.append("set").append(s1.toUpperCase()).append(s2);//set+s1+s2得到方法名,注意变大写
String string=str.toString(); //结果是setxxx,目的是得到对应的方法名,执行该方法
Method[] a=x.getClass().getMethods(); //得到对象x的所有方法,因为x中有setXXX()方法
for(Method method:a) //在所有方法中找到匹配的setXXX()方法
{
if(method.getName().equals(string))
method.invoke(x,c.getTextContent()); //执行x对象的method方法,参数是c.getTextContent()
//这行代码类似于x.setXXX(c.getTextContent())
}
}
}