类加载器总结

  1. 在java代码中,类型的加载、连接与初始化过程都是在程序运行期间完成的
  2. 提供了更大的灵活性,增加了更多的可能性
  3. 在如下几种情况下,java虚拟机将结束生命周期(4种:exit;正常结束;程序异常或错误;操作系统错误导致java虚拟机进程终止)
  4. 加载、连接、初始化
  5. java程序使用方式(2种):主动(7)(创实例、访静态变量、调静态方法、反射、初始化子类、被标明为启动类的类、动态语言支持)、被动。    所有java虚拟机实现必须在每个类或接口 被 java程序 “首次主动使用” 时才初始化他们。
  6. 类的加载(将类的.class文件中的二进制数据读入到内存中)(5种):本地;网络;zip,jar等归档文件,;专有数据库提取;动态编译为.class。
  7.                           类加载器总结
  8. 类加载的最终产品是位于内存中的Class对象。Class对象封装了类在方法区内的数据结构,并提供了访问其的接口
  9. 允许类加载器预先加载某个类,但此过程中遇到了错误必须在首次主动使用时才报告错误。
  10. 连接:将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。(验证、准备、解析)
  11. 初始化步骤:先加载和连接;先初始化直接父类(未初始化的话)(但不适用接口);一次支持类中初始化语句。
  12. ClassLoader类的loadClass方法并不是对类的主动使用,不会导致类的初始化。
  13. 内建于jvm中的启动类加载器( Boot)会加载java.lang.Classloader以及其他的Java平台类。当Jvm启动时,一块特殊的机器码会运行,他会加载扩展类(ext,platform)加载器和系统类(System,app)加载器。
  14. 获得当前类的ClassLoader:clazz.getClassLoader();        当前线程的:Thread.curreThread().getContextClassLoader();      系统的:ClassLoader.getSystemClassLoader();        调用者的:DriverManager.getCallerClassLoader();
  15. JarHell问题及解决办法(待补充)
  16. 双亲委托机制:提高了软件系统的安全性。
  17. Boot:jre/lib/rt.jar; ext: jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包或扩展功能的一些jar包;app:目录中class和classpath中指定的jar包。
  18. 定义类加载器(能的最高级)->初始类加载器(包含定义类加载器)。
  19. 创建用户自定义类加载器:扩展java.lang.ClassLoader,然后覆盖findClass方法即可
  20. 父加载的类子看得到,子加载的父看不到(子加载器的命名空间包含所有父加载器的命名空间)(若两个加载器之间没有直接或间接父子关系则各自加载的类相互不可见)
  21. 由用户自定义的类加载所加载的类是可以被卸载的(Java虚拟机自带的类加载器所加载的类在虚拟机的生命周期中始终不会被卸载(类的Class对象被类加载器始终引用))
  22. 常量在编译阶段会存入调用这个常量的方法所在的类的常量池中。本质上,调用类并没有直接应用到定义常量的类,因此并不会被触发

 

 

 

提醒自己:记笔记;代码实践来理解理论。