2013-06-22 20 views
1

我想第一次使用Javassist,並且卡住了。我在默認包中有一個名爲standard的類。我正在嘗試使用HotSwapper重新加載它。我試過這個,但它不起作用。Javassist熱交換器找不到類

public static void main(String[] args) throws Exception 
{ 
    ClassPool pool = ClassPool.getDefault(); 
    CtClass clazz = pool.get("Standard"); 
    HotSwapper swap = new HotSwapper(8000); 
    swap.reload("Standard", clazz.toBytecode()); 
} 

這是錯誤我得到

Exception in thread "main" java.lang.RuntimeException: no such class: Standard 
at javassist.util.HotSwapper.toRefType(HotSwapper.java:189) 
at javassist.util.HotSwapper.reload(HotSwapper.java:157) 
at JavaHacks.main(JavaHacks.java:15) 

我發動JVM這些ARGS

agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 

怪異的一部分是它加載的類就好了。

回答

1

奇怪的部分是它加載類就好了。

您可能在談論Javassist,但Javassist可以讀取類文件的事實並不意味着該類是由JVM進行類加載的。

您應該更改您的代碼:

public static void main(String[] args) throws Exception { 
    // Ensure Standard class classloading by creating an instance 
    // (calling a static method like Standard.init() would also do) 
    Standard standard = new Standard(); 
    standard.doSomething(); 
    ClassPool pool = ClassPool.getDefault(); 
    CtClass clazz = pool.get("Standard"); 
    HotSwapper swap = new HotSwapper(8000); 
    swap.reload("Standard", clazz.toBytecode()); 
} 

這將確保Standard類是classloaded,因此可以重新加載。

+0

好的,謝謝你的工作 – Popgalop

+0

如何斷開交換器? – flash