zoukankan      html  css  js  c++  java
  • 类加载器

    类加载器的作用

    类加载的过程是在jvm之外实现的,加载就是把类的二进制.class文件加载到内存中,这个动作是用类加载器实现的。

    类加载器的分类

    类加载器一种是虚拟机的一部分的启动类加载器 Bootstrap ClassLoader,一种是其他的类加载器,这些加载器类是继承抽象类
    java.lang.ClassLoader。
    一般类加载器分为四类
    1.根类加载器(BootStrap ClassLoader
    类加载器负责将JAVA_HOME下的lib目录下的jar包文件加载虚拟机内存中。启动类的加载器无法被java程序直接引用,
    用户在编写自定义类加载器时,如果需要把类加载的请求委派为启动类加载器,直接使用null。

    2.扩展类加载器(Extension ClassLoader)
    这个类的加载器是由sun.misc.Launcher$ExtClassLoader实现,它负责JAVA_HOME下的libext目录中的类库。

    3.应用类加载器或者叫系统类加载器(Application ClassLoader)
    这个类加载器是由sun.misc.Lanuncher$AppClassLoader实现。它负责加载用户类路径(ClASS_PATH)上所指定的类库,
    开发者可以直接使用这个类加载器,如果用户没有自定义类加载器,一般情况下就是默认的类加载器

    4.自定义加载器

    双亲委派机制

    如果一个类加载器需要接收到类加载的请求,它首先不会加载这个类,他会把类的加载请求交给父加载器去完成,每一个
    层级类加载器都是如此。只有父加载器无法完成类加载的请求,子加载器才会尝试去加载。
    这样做的好处路径相同的类不会重复加载到内存中,比如java.lang.Object

    ClassLoader例子

    如果类加载器是BootStrap ClassLoader返回的是null
    获取类加载器一般有四种方式
    1获取当前线程上下文类加载器
    Thread.currentThread().getContextClassLoader();
    2获取类的加载器
    class.getClassLoader()
    3.获取系统类加载器
    ClassLoader.getSystemClassLoader()
    4.获取工具类的类加载器,比如DriveManager

    package com.learn.java.javabase.jvm.classloader;
    
    public class ClassLoaderTest13 {
        public static void main(String[] args) {
            //返回当前线程的上下文类加载器,没有指定setContextClassLoader返回的是默认父线程的类加载器
            ClassLoader currentLoader = Thread.currentThread().getContextClassLoader();
            System.out.println("current thread loader" + currentLoader);
            Class<?> currentClass = null;
            try {
                currentClass=Class.forName("com.learn.java.javabase.jvm.classloader.ClassLoaderTest13");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            //currentClass = ClassLoaderTest13.class;
            //返回当前类的加载器Returns the class loader for the class,如果是根类加载器则返回null
            System.out.println(currentClass.getClassLoader());
            System.out.println(String.class.getClassLoader());
    
    
            //返回系统类加载器。当在运行阶段,返回的是调用的线程的上下文加载器
            ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
            System.out.println(systemClassLoader);
    
            while (null != systemClassLoader) {
                systemClassLoader = systemClassLoader.getParent();
                //classLoader=ClassLoader.getSystemClassLoader();
                System.out.println(systemClassLoader);
            }
        }
    }
    
    

    结果

    current thread loadersun.misc.Launcher$AppClassLoader@18b4aac2
    sun.misc.Launcher$AppClassLoader@18b4aac2
    null
    sun.misc.Launcher$AppClassLoader@18b4aac2
    sun.misc.Launcher$ExtClassLoader@3a71f4dd
    null
    
    
  • 相关阅读:
    使用Wireshark捕捉USB通信数据
    simtrace之探秘SIM卡中的世界
    极客DIY:RFID飞贼打造一款远距离渗透利器
    C118+Osmocom-bb+Openbts搭建小型基站
    天猫标的就是虚价,果然败家节啊
    为什么项目的jar包会和tomcat的jar包冲突?
    Spring-JDBC实现Contact的CRUD
    使用maven下载jar包的source和javadoc
    Spring-Context的注解实现依赖注入功能
    [html]三列居中自动伸缩的结构
  • 原文地址:https://www.cnblogs.com/JuncaiF/p/12153580.html
Copyright © 2011-2022 走看看