BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #25791同步于 2013/5/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

求助ClassLoader的问题

yellowxz
2013/5/31镜像同步4 回复
看了关于ClassLoader的文章http://www.iteye.com/topic/136427 问题是:在一个项目里,如果源代码和lib库中有包名和类名都相同的类,执行时会加载的类是源代码中的类。而根据ClassLoader的文章,lib包中的类应该处于System ClassLoader,源代码中的类处于User Custom ClassLoader。那么根据加载的顺序,应该是从父向子加载,那么加载到的是lib包中的类。 求解释
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
itachiwwg机器人#1 · 2013/5/31
你这个假设是有问题的,系统会报错的
yellowxz机器人#2 · 2013/6/1
指的是同包名同类名吗?这个我确定式没问题的,这个特性使用了好几次,以实现自定义类文件替代jar包中类。前提是这个类不是jdk中的类 【 在 itachiwwg 的大作中提到: 】 : 你这个假设是有问题的,系统会报错的
itachiwwg机器人#3 · 2013/6/1
你自己的类与第三方的jar包(jar只要别放到ext/路径下或者核心类路径下)就都是由app那个loader加载的,是按先后顺序加载的,由于java的隐式加载机制第三方jar包里的类只有在new时才会被加载,而此时系统已经加载完你自己的类了,肯定就没法加载第三方jar包里的类,除非你自己定义一个loader进行显式加载。
yellowxz机器人#4 · 2013/6/2
查了一些资料,你说的对,是我之前理解错了。Custom ClassLoader是自定义的ClassLoader。大多数情况下,源代码与jar包都是通过System ClassLoader加载。 加载的顺序是: a. 缺省值:调用java或javaw的当前路径,是项目class所在目录 b. 环境变量classpath设置的路径 c. 执行Java命令行-classpath或-cp的值。如果指定了这两个命令行参数之一,它的值会覆盖环境变量CLASSPATH的值。 d. -jar 选项:如果通过java -jar 来运行一个可执行的jar包,这当前jar包会覆盖上面所有的值.换句话说,-jar 后面所跟的jar包的优先级别最高,如果指定了-jar选项,所有环境变量和命令行制定的搜索路径都将被忽略. 后面你说的有问题:“由于java的隐式加载机制第三方jar包里的类只有在new时才会被加载,而此时系统已经加载完你自己的类了,肯定就没法加载第三方jar包里的类”。自己的类和第三方的jar中的类都是new的时候加载的,否则不会加载,我使用-verbose参数运行证实了。所以加载的顺序还是在于上面说的加载顺序。 【 在 itachiwwg 的大作中提到: 】 : 你自己的类与第三方的jar包(jar只要别放到ext/路径下或者核心类路径下)就都是由app那个loader加载的,是按先后顺序加载的,由于java的隐式加载机制第三方jar包里的类只有在new时才会被加载,而此时系统已经加载完你自己的类了,肯定就没法加载第三方jar包里的类,除非你自己定义一个loader进行显式加载。