类加载过程及类加载器

一、类加载过程(初始化)

Loading

  1. 类加载采用双亲委派机制(主要出于安全来考虑)

  2. 类加载器说明
    在这里插入图片描述

  3. LazyLoading 五种情况

  1. new getstatic putstatic invokestatic指令,访问final变量除外
  2. java.lang.reflect对类进行反射调用时
  3. 初始化子类的时候,父类首先初始化
  4. 虚拟机启动时,被执行的主类必须初始化
  5. 动态语言支持java.lang.invoke.MethodHandle解析的结果为REF_getstatic REF_putstatic REF_invokestatic的方法句柄时,该类必须初始化

Linking

  1. Verification

    验证文件是否符合JVM规定

  2. Preparation

    静态成员变量赋默认值

  3. Resolution
    将类、方法、属性等符号引用解析为直接引用
    常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用

Initializing

  1. 调用类初始化代码 ,给静态成员变量赋初始值

加载过程示意图

在这里插入图片描述

二、ClassLoader相关知识

LoadClass过程

1、从类加载器的缓存中查找是否加载过(找到返回结果,未找到递归从父加载器查找)
2、类加载器中未找到,调用findClass加载Class文件
3、加载上,返回,加载不上,返回ClassNotFound异常

自定义类加载器

  1. extends ClassLoader
  2. 重写 findClass() ,返回defineClass(byte数组转换成class)
 @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try{
            File f = new File("类文件路径",name.replaceAll(".","/"));
            FileInputStream fis = new FileInputStream(f);
            ByteArrayOutputStream bt = new ByteArrayOutputStream();
            int b = 0;
            while((b = fis.read()) != 0){
                bt.write(b);
            }
            byte[] bytes = bt.toByteArray();
            return defineClass(name,bytes,0,bytes.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws Exception{
        T03_CustomerClassloader cus = new T03_CustomerClassloader();
        Class clazz = cus.loadClass("包名");
        Hello h = (Hello) clazz.newInstance();
        h.m();
    }

如何打破双亲委派

  1. 重写loadClass()方法
  2. 何时打破过?
    JDK1.2之前,自定义ClassLoader都必须重写loadClass()
    ThreadContextClassLoader可以实现基础类调用实现类代码,通过thread.setContextClassLoader指定

应用场景

热启动,热部署

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值