类加载器
类加载器的作用
-
类加载的作用:将Class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。
-
类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。不过JVM垃圾回收机制可以回收这些Class对象
类加载器是用来把类(class)装载进内存的。JVM规范定义了如下类型的类的加载器
package com.hua.reflection; public class Test07 { public static void main(String[] args) throws ClassNotFoundException { //获取系统类的加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); System.out.println(systemClassLoader); //获取系统类加载器的父类加载器-->扩展类加载器 ClassLoader parent = systemClassLoader.getParent(); System.out.println(parent); //获取扩展类加载器的父类加载器-->根加载器(c/c++) ClassLoader parent1 = parent.getParent(); System.out.println(parent1); //测试当前类是哪个加载器加载的 ClassLoader classLoader = Class.forName("com.hua.reflection.Test07").getClassLoader(); System.out.println(classLoader); //测试JDK内置的类是谁加载的 classLoader = Class.forName("java.lang.Object").getClassLoader(); System.out.println(classLoader); //如何获得系统类加载器可以加载的路径 System.out.println(System.getProperty("java.class.path")); /** * 双亲委派机制 * //java.lang.String->如果手写的包和根加载器或者是其他jar包一样,那手写的就没有用,会使用原来的包,一级一级往上找 */ /* D:\jdk\jre\lib\charsets.jar; D:\jdk\jre\lib\ext\access-bridge-64.jar; D:\jdk\jre\lib\ext\cldrdata.jar; D:\jdk\jre\lib\ext\dnsns.jar; D:\jdk\jre\lib\ext\jaccess.jar; D:\jdk\jre\lib\ext\localedata.jar; D:\jdk\jre\lib\ext\nashorn.jar; D:\jdk\jre\lib\ext\sunec.jar; D:\jdk\jre\lib\ext\sunjce_provider.jar; D:\jdk\jre\lib\ext\sunmscapi.jar; D:\jdk\jre\lib\ext\sunpkcs11.jar; D:\jdk\jre\lib\ext\zipfs.jar; D:\jdk\jre\lib\jce.jar; D:\jdk\jre\lib\jfr.jar; D:\jdk\jre\lib\jsse.jar; D:\jdk\jre\lib\management-agent.jar; D:\jdk\jre\lib\resources.jar; D:\jdk\jre\lib\rt.jar; D:\javacode\注解和反射\out\production\af; D:\idea\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar */ } }