21-类加载器实战剖析与疑难点解析

类加载器实战剖析与疑难点解析

1.找到各种类加载所加载class文件的位置:

public class MyTest18 {
    public static void main(String[] args) {
        System.out.println(System.getProperty("sun.boot.class.path"));//根类加载器
        System.out.println(System.getProperty("java.ext.dirs"));      //扩展类加载器
        System.out.println(System.getProperty("java.class.path"));    //系统类加载器
    }+
}

运行结果:

C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\classes

C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext;C:\Windows\Sun\Java\lib\ext

C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\servlet-api.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;E:\Program Files (x86)\IdeaProject\Javalearn\正则表达式啊\out\production\IdeaProject;E:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar

2.使用根类加载器加载文件

  • 由上述知道,根类加载所加载文件的位置:C:\Program Files\Java\jdk1.8.0_131\jre\classes;

    • 所以,这里在jre文件夹下面创建:classes/Jvm/×××.class文件,最终运行结果:由根类加载器加载MyParent.class文件。

    • public class MyTest18_1 {
          public static void main(String[] args) throws Exception {
              MyTest16 loader1 = new MyTest16("laoder1");
              loader1.setPath("C:\\Users\\admin\\Desktop\\");
              Class<?> clazz = loader1.loadClass("Jvm.MyParent");
              System.out.println("class : " + clazz.hashCode());
              System.out.println("class loader : "+clazz.getClassLoader());
          }
      }
      运行结果:
         class : 1761291320
         class loader : null     <---根类加载器
      

3.使用扩展类加载器加载文件

  • 正常运行时:由运行结果可知:aesKeyGenerator使用扩展类加载器加载。

    public class MyTest19 {
        public static void main(String[] args) {
            AESKeyGenerator aesKeyGenerator = new AESKeyGenerator();
            System.out.println(aesKeyGenerator.getClass().getClassLoader());
            System.out.println(MyTest19.class.getClassLoader());
        }
    }
    运行结果:
       sun.misc.Launcher$ExtClassLoader@610455d6
       sun.misc.Launcher$AppClassLoader@18b4aac2
    
  • 当配置扩展类加载器去加载当前目录下的class文件时,在运行上述程序,则出现NoClassDefFoundError
    在这里插入图片描述

发布了25 篇原创文章 · 获赞 0 · 访问量 1452

猜你喜欢

转载自blog.csdn.net/qq_40574305/article/details/104793467