使用javassist调用定制的类加载器
我正在使用javassist API创建一个方法:使用javassist调用定制的类加载器,java,classloader,javassist,Java,Classloader,Javassist,我正在使用javassist API创建一个方法: CtMethod newmethod = CtNewMethod.make("public boolean preRemove(){return size==getObjectSize();}",ctclass); 此方法调用该类中存在的另一个方法getObjectSize() 在这种情况下,我得到了试图为name复制的类定义,其中LinkageError由该指令引起class clazz=ctclass.toClass() 因此,我尝试创建
CtMethod newmethod = CtNewMethod.make("public boolean preRemove(){return size==getObjectSize();}",ctclass);
此方法调用该类中存在的另一个方法getObjectSize()
在这种情况下,我得到了试图为name
复制的类定义,其中LinkageError
由该指令引起class clazz=ctclass.toClass()代码>
因此,我尝试创建自己的类加载器CustomClassLoader=newcustomclassloader()代码>
然后当我列出类的方法时,我没有得到新方法
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());
}
ClassPool=ClassPool.getDefault();
CtClass-CtClass=pool.get(“javaExp.SinglyLinkedList”);
ctclass.停止运行(正确);
CtMethod newmethod=CtNewMethod.make(“public boolean preRemove(){return size==getObjectSize();}”,ctclass);
ctclass.addMethod(newmethod);
ctclass.writeFile();
Class clazz=loader.loadClass(“javaExp.SinglyLinkedList”);
方法[]m=clazz.getDeclaredMethods();
for(int i=0;iJavassist提供类加载器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类的新实例