当从jar加载外部类时,javassist抛出ClassNotFoundException

当从jar加载外部类时,javassist抛出ClassNotFoundException,java,javassist,java-reflection,Java,Javassist,Java Reflection,我正在尝试使用javassist加载一个外部jar文件&在运行时调用它的main方法,但是当我尝试使用以下代码执行此操作时: File file = new File("C:\\Users\\MainPC\\Desktop\\test.jar"); ClassPool cp = ClassPool.getDefault(); cp.insertClassPath(file.getAbsolutePath()); Class<?>

我正在尝试使用javassist加载一个外部jar文件&在运行时调用它的main方法,但是当我尝试使用以下代码执行此操作时:

    File file = new File("C:\\Users\\MainPC\\Desktop\\test.jar");
    ClassPool cp = ClassPool.getDefault();
    cp.insertClassPath(file.getAbsolutePath());

    Class<?> MainClass = cp.get("TestPackage.MainClass").toClass();
    MainClass.getMethod("main", String[].class).invoke(null, new Object[] {args});
当我仅使用内置java反射api尝试相同的操作时,它不会出现任何问题:

    File file = new File("C:\\Users\\MainPC\\Desktop\\test.jar");
    URLClassLoader cl = new URLClassLoader(new URL[] {new URL("jar:file:"+file.getAbsoluteFile()+"!/")});
    
    Class<?> clazz = cl.loadClass("TestPackage.MainClass");
    clazz.getMethod("main", String[].class).invoke(null, new Object[] {args});
File File=new文件(“C:\\Users\\MainPC\\Desktop\\test.jar”);
URLClassLoader cl=newURLClassLoader(新URL[]{newURL(“jar:file:”+file.getAbsoluteFile()+“!/”)});
Class clazz=cl.loadClass(“TestPackage.MainClass”);
getMethod(“main”,String[].class).invoke(null,新对象[]{args});
(上面没有抛出异常&按预期调用jar文件的main方法)

这让我相信我在javassist中做错了什么(特别是在加载jar文件类方面)。有人能给我解释一下是什么吗?
我应该提到jar文件只包含2个类:MainClass.class和OtherClass.class。两者都驻留在名为TestPackage的包中。这个错误似乎与javassist加载MainClass类时找不到其他类有关。

问题是,当我调用
ct.toClass()
时,它只将类本身暴露给我的运行时类加载器(而不是整个类池的类路径)。当我稍后尝试调用这个类的main方法时,我的运行时类加载器尝试执行加载另一个类的部分,而它显然不知道这个类,因此抛出一个ClassNotFoundException

解决方案是使用javassist提供的类加载器(javassist.Loader),它将类池作为构造函数中的参数,然后能够正确地从类池类路径加载和解析类

下面是我试图实现的工作代码示例:

    File file = new File("C:\\Users\\MainPC\\Desktop\\test.jar");
    ClassPool cp = ClassPool.getDefault();
    cp.insertClassPath(file.getAbsolutePath());

    Loader loader = new Loader(cp);
    Class<?> MainClass = loader.loadClass("TestPackage.MainClass");
    MainClass.getMethod("main", String[].class).invoke(null, new Object[] {args}); 
File File=new文件(“C:\\Users\\MainPC\\Desktop\\test.jar”);
ClassPool cp=ClassPool.getDefault();
cp.insertClassPath(file.getAbsolutePath());
装载机=新装载机(cp);
Class MainClass=loader.loadClass(“TestPackage.MainClass”);
getMethod(“main”,字符串[].class).invoke(null,新对象[]{args});
    File file = new File("C:\\Users\\MainPC\\Desktop\\test.jar");
    ClassPool cp = ClassPool.getDefault();
    cp.insertClassPath(file.getAbsolutePath());

    Loader loader = new Loader(cp);
    Class<?> MainClass = loader.loadClass("TestPackage.MainClass");
    MainClass.getMethod("main", String[].class).invoke(null, new Object[] {args});