2014-10-28 69 views
0

我要做到以下幾點:用Javassist創建類,並使其可

try { 
    Class.forName("MyClass"); 
} catch(ClassNotFoundException e) { 
    ClassPool pool = ClassPool.getDefault(); 
    CtClass cc = pool.makeClass("MyClass"); 
    Class.forName("MyClass"); 
} 

我已經嘗試過了,但它似乎並不總是工作...它工作在一個範圍內,但在另一個相同的代碼崩潰在第二個「Class.forName(」MyClass「)」...調用cc.toClass()總是帶來正確的類,並試圖cc.writeFile(),但它沒有區別。不知何故,在某些情況下,第二個Class.forName找到類,而在其他情況下,它只是打破...我錯過了什麼?

回答

2

我發現我的代碼是在不同的類加載器上創建類,具體取決於我從哪裏調用它。我這樣做解決了這個如下:

try { 
    Class.forName("MyClass"); 
} catch(ClassNotFoundException e) { 
    ClassPool pool = ClassPool.getDefault(); 
    CtClass cc = pool.makeClass("MyClass"); 
    cc.toClass(this.getClass().getClassLoader(), this.getClass().getProtectionDomain()); 
    Class.forName("MyClass"); 
} 

調用toClass方法用正確的類加載器的伎倆......我是如何在什麼類加載器創建的類將成爲可用的控制只是不確定,但該方法與類加載器參數允許我正在尋找什麼。

1
`try { 
    Class.forName("MyClass"); 
} catch(ClassNotFoundException e) { 
try { 
    ClassPool pool = ClassPool.getDefault(); 
    CtClass cc = pool.makeClass("MyClass"); 
    Class.forName("MyClass"); 
catch(Exception e) { 
} 
}` 

請檢查此代碼,有時候jvm優化代碼並隨機播放語句,try塊中除外。

+0

那麼,第二個嘗試塊在那裏,我只是上傳了一個「縮短」版本來顯示問題......我注意到cc.toClass()並不總是使用相同的類加載器(這是用於單元測試)。 – Martin 2014-10-28 12:03:57