使用javassist调用定制的类加载器

使用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() 因此,我尝试创建

我正在使用javassist API创建一个方法:

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类的新实例