문제

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;
    }
}

The code above runs well if I open the comment block. But if run like above, it will throw exception, which is java.lang.StackOverflowError. I don't know why, who can explain it for me? thanks a lot.

도움이 되었습니까?

해결책

The call o.setName("vincen"); is causing a recursion, in other words the setName() method is being invoked by its handler. Just remove that line.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top