zoukankan      html  css  js  c++  java
  • Java类加载机制


    0. 概述

      转载 & 修改 & 补充自 Java类加载机制

      Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。

      虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。


    1. 什么是类的加载

      类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

      类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。


    2. 自定义类加载

    自定义加载器、接口、app在本地

    实现类在远方

     

    自定义类加载器

     1 import java.io.ByteArrayOutputStream;
     2 import java.io.FileInputStream;
     3 
     4 /**
     5  * 自定义类加载
     6  */
     7 public class MyClassLoader extends ClassLoader {
     8     protected Class<?> findClass(String name) throws ClassNotFoundException {
     9         try {
    10             // 定义类的path
    11             String path = "f:\share\test\" + name + ".class";
    12             // 新建输入流
    13             FileInputStream fis = new FileInputStream(path);
    14             // 新建输出流
    15             ByteArrayOutputStream baos = new ByteArrayOutputStream();
    16             byte[] buf = new byte[1024];
    17             int len = -1;
    18             // 流拷贝
    19             while ((len = fis.read(buf)) != -1) {
    20                 baos.write(buf, 0, len);
    21             }
    22             baos.close();
    23             fis.close();
    24 
    25             // 得到byte数组
    26             byte[] data = baos.toByteArray();
    27             // 使用类加载器的方法生成类对象,defineClass方法的作用是将byte数组转换为类的实例。
    28             Class clz = defineClass(data, 0, data.length);
    29             return clz;
    30         } catch (Exception e) {
    31             e.printStackTrace();
    32         }
    33         return null;
    34     }
    35 }

    JAVA类加载机制面试题


    且将新火试新茶,诗酒趁年华。
  • 相关阅读:
    获取一个日期月的所有日期
    elementUI 日期 周一、周二、周三、周四、周五、周六、周日快捷键
    两个日期之间的天数集合
    数组去重并排序
    日历封装
    <转载> VUE项目中CSS管理
    【转载】Vue项目自动转换 px 为 rem,高保真还原设计图
    HTML5新标签
    pChart图表插件使用
    JavaScript ajax请求
  • 原文地址:https://www.cnblogs.com/share23/p/9640199.html
Copyright © 2011-2022 走看看