public class PracticeJavassist2 {
@Test
public void test2() throws InstantiationException, IllegalAccessException{
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(JavassistClass.class);
// factory.setFilter(new MethodFilter() {
// public boolean isHandled(Method arg0) {
// if(arg0.getName().equals("getName")){
// return true;
// }
// return false;
// }
// });
Class<?> c = factory.createClass();
JavassistClass jc = (JavassistClass)c.newInstance();
((Proxy)jc).setHandler(new MethodHandler() {
public Object invoke(Object arg0, Method arg1, Method arg2, Object[] arg3)throws Throwable {
JavassistClass o = (JavassistClass)arg0;
o.setName("vincen");
System.out.println(o.getClass().getName());
return arg2.invoke(arg0, arg3);
}
});
System.out.println(jc.getName());
}
}
class JavassistClass{
private String name = "default";
public JavassistClass(){
name = "me";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
如果我打开评论块,上面的代码运行良好。但如果像上面这样运行,它将抛出异常,即java.lang.StackOverflowError
。我不知道为什么,谁能为我解释一下?非常感谢。
答案 0 :(得分:0)
调用o.setName("vincen");
导致递归,换句话说,setName()
方法正由其处理程序调用。只需删除该行。