javassist异常

时间:2012-12-30 15:28:23

标签: java javassist dynamic-proxy

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。我不知道为什么,谁能为我解释一下?非常感谢。

1 个答案:

答案 0 :(得分:0)

调用o.setName("vincen");导致递归,换句话说,setName()方法正由其处理程序调用。只需删除该行。