用spring aop拦截参数,参数可能是对象,于是我重载了对象的tostring方法,用反射取出对象的属性值代码如下:
public class BaseBean {
/**
*
*/
private static final long serialVersionUID = 1L;
public String toString() {
String s = "";
try {
s = getPropertyString(this);//获取对象属性值
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
}
public String getPropertyString(Object entityName) throws Exception {
String methodname=null;
Method method = null;
Class c = entityName.getClass();
Field field[] = c.getDeclaredFields();
StringBuffer sb = new StringBuffer();
for (Field f : field) {
if(!f.getName().equals("serialVersionUID" )){
methodname=f.getName().substring(0, 1).toUpperCase()+ f.getName().substring(1);//取得方法名称
method=c.getMethod("get"+methodname);//取得方法
sb.append(method.invoke(entityName));//调用方法并把得到的值相加
}
}
entityName=null;
System.gc();//销毁对象
return sb.toString();
}
直接测试的时候没问题,测试代码:
public class Test {
public static void main(String[] args){
for(int i=0;i<10;i++){
User user=new User();
user.setUsername("yyy");
user.setAddress("zzz");
System.out.println(user.toString());
}
}
}
但是放在AOP中就出现java.lang.StackOverflowError异常,提示是Field field[] =c.getDeclaredFields();sb.append(method.invoke(entityName));这两行出错;
还有个奇怪的信息:at java.util.AbstractCollection.toString(Unknown Source)
at org.hibernate.collection.PersistentSet.toString(PersistentSet.java:310)
不知道关hibernate什么事情,spring拦截代码如下:
public void charcheck(JoinPoint joinpoint){
Object[] obj=joinpoint.getArgs();
System.out.println(obj[0].toString());
}