需求:需要访问指定的jar包和class,其中jar中有方法引用指定class,因为class会有内容变动,所以不能打入jar内,用URLClassLoader可以访问jar中提供的接口,但是在其运行中会报找不到指定class 错误。例如: 指定 common.jar 中的接口 A.a()方法调用指定路径的class B, B b = new B(); 出现java.lang.NoClassDefFoundError 异常,求各位大虾帮助!感激不尽
调试欢乐多
Class clazzB = loader.loadClass("xxx.ooo.XXOO");
Object objB = clazzB.newInstance(); // 不应直接写: B objB = (B) clazzB.newInstance(); 更不能写 B objB = new B();
然后用反射去调用该对象的方法(函数)。
这不是明摆着的问题话说俺3楼的回复,你看了木?
引用外部Class的类文件中,必然不能直接写外部Class的类名,因为你自身的jar里面根本没有这个类的定义。
好吧,是我没说清楚。想想Eclipse 里面可以直接引用外部的classes直接使用. 再举个例子,tomcat 的lib和classes, lib下面的jar包里也没有classes文件夹种的class却可以直接使用,我想要做到的就是这个效果,不过不是通过服务器容器,直接通过反射调用jar包的接口。不知道大虾你有没有好的想法,万分感谢
而你目前的场景是:你的主类是在某ClassLoader中被装载和实例化的,然后你在主类中企图新建一个ClassLoader去装载另一个类B;那么很遗憾,你主类所在的ClassLoader完全不知道你这个类B。三种可能处理方法:
1、你能修改主类的宿主ClassLoader的检索范围,这个要看看运气了;
2、你要另外再建立一个启动类,它创建ClassLoader,从ClassLoader中启动你的主类,这样你的主类跟你主类企图调用的B,就在同一个ClassLoader中工作了;
3、B类继承自某接口 I,这个接口定义I在主类所在的JAR包中,那么使用时能稍微方便点:
I obj = (I) clazzB.newInstance();