• 关于JVM的ClassLoader(转)


         众所周知,java是编译型的语言,写的是java文件,最后运行的是class文件,class文件是运行在JVM之中的,这时候就有一个问题,JVM如何装载class文件的?是通过ClassLoader来进行的,这里做一下笔记,因为发现原作者写的很好《深入分析java web 技术内幕》。

    ClassLoader的结构分析

        ClassLoader是一个抽象类,他有很多子类,JVM默认有几个实现类,当然我们也可以自己继承ClassLoader。

        1、defineClass:将byte字节转换为JVM能够识别的Class对象,这样就意味着可以是class文件也可是是网络上的字节流了;

        2、defineClass通常和findClass一起使用,findClass的作用是取得要加载的类的字节码;

        3、如果想在类被加载到JVM的时候就被链接,可以调用resolveClass来完成;

        4、如果不想自定义加载类的规则,也没有复杂的逻辑,可以通过this.getClass().getClassLoader().loadClass("") 来进行加载;

    ClassLoader中的几个实现类

        1、Bootstrap ClassLoader 这个是JVM加载自身工作需要的类,完全由JVM自己来控制,外部无法访问到这个;

        2、ExtClassLoader比较特殊的,服务的特定目标在System.getProperty("java.ext.dirs");

        3、AppClassLoader,父类是ExtClassLoader,"java.class.path"中的类都可以被这个类加载器加载;

        4、URLClassLoader,一般这个类帮我们实现了大部分的工作,自定义可以继承这个类,这样仅仅在需要的地方做修改就行了;

    JVM加载class文件到内存的方式

        1、显示加载:不通过代码里的ClassLoader调用,而是JVM来自动加载类到内存中的方式;

                1.1、通过Class中的forName;

                1.2、通过ClassLoader中的loadClass

                1.3、通过ClasLoader中的findSystemClass

        2、隐身加载:通过代码中ClassLoader来加载的方式;

    如何加载class文件

        1、找到.class文件,并把文件中包含的byte加载到内存中

        2、验证和解析

              2.1、字节码验证,确保格式正确和行为正确

              2.2、类准备,类中定义的字段、方法和实现接口锁必须的数据结构

              2.3、解析,装入类所引用的其他所有类,如父类、字段、方法签名、方法中使用的本地变量等

        3、静态属性和初始化赋值,以及静态块的执行等

    关于类加载过程中的几种常见异常

    1、ClassNotFoundException

        JVM要加载指定的文件的字节码到内存中,但是并没有发现这个文件的字节码。检查方法就是在classpath中看看是否有指定文件存在。

    2、NoClassDefFoundError

        JVM规范中这个异常出现的情况是使用new 关键字、属性引用类、实现接口、继承类,如果不存在,会报这个异常。

    3、ClassCastException

        对于普通对象,对象必须是目标类的实例或者目标类的子类的实例,如果目标类是接口,那么会把他当做实现了该接口的一个子类。

    有哪些需要自定义ClassLoader的情况?

    1、在自定义的路径下查找自定义的classs文件,需要的文件并不是classpath下面的;

    2、对于加载的类做特殊的处理,例如网络传输的安全性等;

    3、可以定义类的失效机制,例如检查到文件被修改,则重新加载,从而实现类的热部署;

    http://iamzhongyong.iteye.com/blog/2091549

  • 相关阅读:
    try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?
    BigDecimal 使用 静态方法总结
    成员内部类里面为什么不能有静态成员和方法?
    浅谈多态机制的意义及实现
    Java接口中的成员变量的意义
    IDEA 打包和导入 Jar 包
    Java static关键字
    Java this关键字
    Java 匿名对象
    Java JOptionPane 对话框
  • 原文地址:https://www.cnblogs.com/softidea/p/4336020.html
Copyright © 2020-2023  润新知