2014-04-21 20 views
0

我使用了Javassist API來創建一個方法:調用自定義類加載器的用Javassist

CtMethod newmethod = CtNewMethod.make("public boolean preRemove(){return size==getObjectSize();}",ctclass); 

這個方法調用,在這種情況下,我得到存在於該類

的另一種方法getObjectSize() attempted duplicate class definition for nameLinkageError由該指令引發Class clazz = ctclass.toClass();

所以,我試圖創建自己的ClassLoader CustomClassLoader loader = new CustomClassLoader();

,然後當我列出的類

ClassPool pool = ClassPool.getDefault(); 
CtClass ctclass = pool.get("javaExp.SinglyLinkedList"); 
ctclass.stopPruning(true); 
CtMethod newmethod = CtNewMethod.make("public boolean preRemove(){return size==getObjectSize();}",ctclass); 
ctclass.addMethod(newmethod); 
ctclass.writeFile(); 
Class<?> clazz =loader.loadClass("javaExp.SinglyLinkedList"); 
Method []m= clazz.getDeclaredMethods(); 
for(int i=0;i<m.length;i++){ 
System.out.println(m[i].getName()); 
} 

回答

0

Javassist提供了一個類加載器javassist.Loader的方法,我沒有得到的新方法。該類加載器使用javassist.ClassPool對象來讀取類文件。

例如,javassist.Loader可用於加載用Javassist修改的特定類。

import javassist.*; 
import test.Rectangle; 

public class Main { 
    public static void main(String[] args) throws Throwable { 
    ClassPool pool = ClassPool.getDefault(); 
    Loader cl = new Loader(pool); 

    CtClass ct = pool.get("test.Rectangle"); 
    ct.setSuperclass(pool.get("test.Point")); 

    Class c = cl.loadClass("test.Rectangle"); 
    Object rect = c.newInstance(); 

    } 
} 

該程序修改類test.Rectangle。 test.Rectangle的超類設置爲test.Point類。然後這個程序加載修改後的類,並創建一個新的test.Rectangle類的實例。

相關問題