2012-12-30 79 views
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。我不知道爲什麼,誰能爲我解釋?非常感謝。javassist例外

回答

0

調用o.setName("vincen");正在引起遞歸,換句話說,setName()方法正在被其處理程序調用。只要刪除該行。