日期:2014-05-20  浏览次数:20769 次

崩溃求助大虾,关于ClassLoader如何加载指定class
需求:需要访问指定的jar包和class,其中jar中有方法引用指定class,因为class会有内容变动,所以不能打入jar内,用URLClassLoader可以访问jar中提供的接口,但是在其运行中会报找不到指定class 错误。例如: 指定 common.jar 中的接口 A.a()方法调用指定路径的class B, B b = new B(); 出现java.lang.NoClassDefFoundError 异常,求各位大虾帮助!感激不尽
------最佳解决方案--------------------
不行,因为几种情况的运行机制不同。

Eclipse启动的机制,是启动JVM时就把所需的CLASSPTH 和 jar 包都直接设定好了。

Tomcat启动你应用的时候,是自己初始化了一个ClassLoader,并将相关的 WEB-INF 内容放入该ClassLoader的搜索范围。后续整个应用都将在此ClassLoader下工作,当然不会有任何问题。


而你目前的场景是:你的主类是在某ClassLoader中被装载和实例化的,然后你在主类中企图新建一个ClassLoader去装载另一个类B;那么很遗憾,你主类所在的ClassLoader完全不知道你这个类B。

三种可能处理方法:
1、你能修改主类的宿主ClassLoader的检索范围,这个要看看运气了;
2、你要另外再建立一个启动类,它创建ClassLoader,从ClassLoader中启动你的主类,这样你的主类跟你主类企图调用的B,就在同一个ClassLoader中工作了;
3、B类继承自某接口 I,这个接口定义I在主类所在的JAR包中,那么使用时能稍微方便点:
   I obj = (I) clazzB.newInstance();
------其他解决方案--------------------
class 没有编译才会报这个错

------其他解决方案--------------------
包有没有重名的现象?
------其他解决方案--------------------
首先class的jar包,必须包含在工程classpath引用内。否则你需要使用绝对路径文件,先加载jar包
------其他解决方案--------------------
引用:
经过我测试,发现加载jar包和外部class的classloader不一样,导致jar不能调用外部class。


这不是明摆着的问题。。。话说俺3楼的回复,你看了木?


引用外部Class的类文件中,必然不能直接写外部Class的类名,因为你自身的jar里面根本没有这个类的定义。
------其他解决方案--------------------
顶楼上,ClassLoader与ClassLoader之间貌似都是隔绝严密啊
------其他解决方案--------------------
如果你要用自定义的ClassLoader去装载特定 class,首先第一要点就是,不要去声明这个类型。

也就是你只能:
    Class clazzB = loader.loadClass("xxx.ooo.XXOO");
    Object objB = clazzB.newInstance(); // 不应直接写: B objB = (B) clazzB.newInstance();  更不能写 B objB = new B();
然后用反射去调用该对象的方法(函数)。
------其他解决方案--------------------
各位大虾,这个需求的目的就是为了在已有工程的基础上实现外部调用。 经过我测试,发现加载jar包和外部class的classloader不一样,导致jar不能调用外部class。总之还是要感谢各位的热情回复。
------其他解决方案--------------------
引用:
引用:
经过我测试,发现加载jar包和外部class的classloader不一样,导致jar不能调用外部class。

这不是明摆着的问题。。。话说俺3楼的回复,你看了木?


引用外部Class的类文件中,必然不能直接写外部Class的类名,因为你自身的jar里面根本没有这个类的定义。


好吧,是我没说清楚。想想Eclipse 里面可以直接引用外部的classes直接使用. 再举个例子,tomcat 的lib和classes, lib下面的jar包里也没有classes文件夹种的class却可以直接使用,我想要做到的就是这个效果,不过不是通过服务器容器,直接通过反射调用jar包的接口。不知道大虾你有没有好的想法,万分感谢