org.apache.commons.beanutils是我们经常会用到工具包,其中的describe方法可以将对象的所有可读属性和对应值放入Map中返回给我们,下面的代码片段由qdcrm系统中的线上代码转化而来:
public class ObjA {
public String a;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public Map getProperty() {
try {
return (BeanUtils.describe(this));
} catch (Exception e) {
System.out.println(e.getStackTrace());
}
return null;
}
}
你看出这段代码有什么问题了吗?
下面我们来分析一下:
当我们对ObjA的一个实例调用getProperty()方法的时候,首先describe方法会通过PropertyUtilsBean.getPropertyDescriptors()获取ObjA的所有属性,而该方法会通过查看一个属性是否有getter或setter来判断这个属性是否存在,也就是说,如果存在方法void setXXX(XXX xxx)或者方法XXX getXXX()则他就会认为这个类包含属性XXX。那么现在程序拿到的ObjA属性列表将是[a,class,property],既然得到了属性列表,那接下来便要根据属性列表去获取对应属性的值了,这时程序将调用每个属性对应的get方法去获取属性的值,于是getProperty方法又被调用了,这里便出现了循环调用,会导致栈溢出错误。
解决的办法很简单,我们只要将getProperty换一个方法名即可,比如叫做property()。