当从jar加载外部类时,javassist抛出ClassNotFoundException
我正在尝试使用javassist加载一个外部jar文件&在运行时调用它的main方法,但是当我尝试使用以下代码执行此操作时:当从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<?>
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});