我正在研究jvm类加载过程,并且知道以下事实:
类加载器子系统使用委托层次结构算法 它将按顺序从BootStrap路径搜索 - >扩展路径 - >应用程序路径。
然后我想在实际代码中“尝试”这个,如下所示:
创建一个A类和B类;带有main()方法和B类变量的A类。
编译之后,我使用jar命令从B.class获取B类的jar文件,然后删除B.class文件,将B.jar文件放到jdk / jre / lib / ext中 (因为oracle doc说extClassLoader不会在jdk / jre / lib / ext中搜索任何松散的类文件。)
结果是ClassNotFoundException。所以我的问题是:
1)jvm是否允许从BootStrap和Extension类路径加载用户的clasfile?
2)如果是这样,为什么使用委托层次算法加载它似乎导致效率低?
tks ....
答案 0 :(得分:0)
经过几次ClassNotFoundException,我得到了java.lang.IllegalAccessError,它至少表明extclassloader试图访问我的班级B.jar
因为我没有声明A类和B类的包,所以这可能是原因所以我只是在我的B类之前添加了一个公共修饰符,并且如上所述,最后ExtClassLoader与我的B.jar一起使用。
虽然仍然不知道为什么jvm第一次忽略我的jar文件然后再读它....似乎jvm保留了一个目录列表(BootStrap和Ext类路径),它不会及时更新像我的电脑系统
答案 1 :(得分:0)
听起来你在部署中做错了什么。
我过去曾使用lib/endorsed
,即使对于内部java.lang*
类也没有问题。
JVM不会缓存从一次运行到下一次运行的任何事情。