到底哪个class里面的代码会执行呢?

背景1:我们知道java中类加载机制采用双亲委托制机制,一个classloader要加载一个类,首先会委托他的上级加载器尝试加载,如果上级加载不成功才会自己加载。

背景2:我们自己的类的加载器是AppClassLoader,它的上级是ExtClassLoader。ExtClassLoader会在%JAVA_HONME%/jre/lib/ext目录中寻找、加载类。

背景3:我自己写了一个Test.java,编译后为Test.class。按背景2,Test的加载器是AppClassLoader,再根据背景1,它会首先委托ExtClassLoader去尝试加载。ExtClassLoader在%JAVA_HONME%/jre/lib/ext中找不到该类,故加载失败,所以最终还是会由AppClassLoader来加载Test.class。

问题:
可是,如果我把编译好的Test.class打成jar包,放到%JAVA_HONME%/jre/lib/ext目录中,那么当AppClassLoader委托给ExtClassLoader加载时,ExtClassLoader会加载成功吗?

这个问题困扰我的地方在于,按照背景2,貌似的确应该由ExtClassLoader去加载Test。但我感觉这违反直觉,我要运行的是本地的Test.class,但是JVM却加载了另一个Test.class(%JAVA_HONME%/jre/lib/ext下),那么本地这个Test.class还有什么意义?

繁星coding
浏览 97回答 1
1回答

慕妹3242003

ext下面的类会被优先加载,这没什么违背直觉的啊,或者说是你把Test拷到ext里面是违背直觉的,反过来想如果你在自己的工程里面写个java.lang.String,jvm也会优先加载上级loader下面的String.class,要不怎么保证jvm的安全性
打开App,查看更多内容
随时随地看视频慕课网APP