类加载器

类加载器,它拿到.class文件,它会把他拆成两部分,将static数据转换成方法区的数据结构,然后把他放在了方法区之中。
然后在堆里面建一个类对象(Class,它可以用来实例化对象),然后可以通过这个类对象找到位于方法区的static数据。、
注意:访问对象是从栈去找,然后在从访问对象,而这个堆分为两部分(堆,方法区(特殊的堆)),因为有时候会有很多个普通对象,所以为了区分,也方便查找,就把类对象放在方法区中。这样找起来就快了。

  • package Reflection;
    public class Test05 {
        public static void main(String[] args) throws ClassNotFoundException {
            //获取系统类加载器
            ClassLoader systemClassLoader =ClassLoader.getSystemClassLoader();
            System.out.println (systemClassLoader);
            //测试父类加载器(Extention ClassLoader)
            ClassLoader parent = systemClassLoader.getParent ();
            System.out.println (parent);
            //扩展类加载器父类加载器,根(引导类)加载器,这个用户是获取不到的,最高一层
            ClassLoader gradepa = parent.getParent ();
            System.out.println (gradepa);
            //测试当前类是哪个加载器加载的
            ClassLoader classLoader = Class.forName ("Reflection.Test05").getClassLoader ();
            System.out.println (classLoader);
            //测试JDK内部类是由谁加载的,Object是最高级的了,创建它的类就是引导类加载器,也是不允许获取的
            classLoader = Class.forName ("java.lang.Object").getClassLoader ();
            System.out.println (classLoader);
            //获取java的扩展类
            System.out.println (System.getProperty("java.class.path"));
        }
    }
    结果:
        sun.misc.Launcher$AppClassLoader@dad5dc
        sun.misc.Launcher$ExtClassLoader@16d3586
        null
        sun.misc.Launcher$AppClassLoader@dad5dc
        null
        C:\jdk\jre\lib\charsets.jar;C:\jdk\jre\lib\deploy.jar;C:\jdk\jre\lib\ext\access-bridge.jar;C:\jdk\jre\lib\ext\cldrdata.jar;C:\jdk\jre\lib\ext\dnsns.jar;C:\jdk\jre\lib\ext\jaccess.jar;C:\jdk\jre\lib\ext\jfxrt.jar;C:\jdk\jre\lib\ext\localedata.jar;C:\jdk\jre\lib\ext\nashorn.jar;C:\jdk\jre\lib\ext\sunec.jar;C:\jdk\jre\lib\ext\sunjce_provider.jar;C:\jdk\jre\lib\ext\sunmscapi.jar;C:\jdk\jre\lib\ext\sunpkcs11.jar;C:\jdk\jre\lib\ext\zipfs.jar;C:\jdk\jre\lib\javaws.jar;C:\jdk\jre\lib\jce.jar;C:\jdk\jre\lib\jfr.jar;C:\jdk\jre\lib\jfxswt.jar;C:\jdk\jre\lib\jsse.jar;C:\jdk\jre\lib\management-agent.jar;C:\jdk\jre\lib\plugin.jar;C:\jdk\jre\lib\resources.jar;
    C:\jdk\jre\lib\rt.jar;
    D:\project\JavaTest2\out\production\JavaTest2;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar
    
    
    

class对象在堆里面。对象一般都比较大,所以全放在堆里面(堆相当于一本书的内容部分)
自问自答:
类缓存?
顾名思义,就是一个类如果被放倒类加载器中,加载完了之后,还会保留一段时间。
类加载器分类?分三类(引导区加载器,扩展类加载器,系统类加载器),层次由高到底
测试当前类是哪个加载器加载的,测试JDK内置的类是由谁加载的,如何获得类加载器的加载路径?
ClassLoader返回的是一串字符串,先用ClassLoader.getSystemClassLoader可以获取系统类加载器,然后通过getParent()再往上获取。
双亲委派机制(就是优先启用系统原有的jar包,你写的就算一模一杨他也不用。)!

版权声明:本文为li33原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/li33/p/12726930.html