1
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。理由がわからないのですが、どなたか教えていただけないでしょうか?どうもありがとう。

4

1 に答える 1

0

呼び出しo.setName("vincen");によって再帰が発生しています。つまり、setName()メソッドがハンドラーによって呼び出されています。その行を削除するだけです。

于 2012-12-30T19:12:41.473 に答える