类加载器.txt 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 类加载器
  2. 类的加载过程:
  3. Java文件--->Class文件(字节码文件)--->虚拟机进行解释
  4. 加载类的时机:
  5. 1、创建类的对象
  6. 2、调用类的类方法
  7. 3、访问类或接口的类变量或为类变量赋值
  8. 4、使用反射方式来强制创建某个类或接口的Class对象
  9. 5、初始化某个类的子类
  10. 6、直接使用java.exe命令来运行某个类
  11. 其实就是只要实用了这个类或这个类的成员或者这类的子类,这时候就会加载这个类到虚拟机
  12. 类的加载过程:
  13. 1、通过一个类的全限定名(包名.类名)获取定义这个类的二进制字节流。
  14. 2、把这个字节流的静态存储结构转换为运行时数据结构
  15. 3、在内存中生成一个代表这个类的java.lang.Class对象,任何类在被使用的时候,系统都会创建他的java.lang.Class对象
  16. 类的加载过程:
  17. 1、加载
  18. |-通过包名.类名,找到这个类,并且准备使用流进行传输
  19. |-就是把这个类加载到内存中,当加载完毕之后,就会创建一个Class对象
  20. 2、链接
  21. |-1、验证
  22. 验证阶段是链接阶段的第一步
  23. 保证Class文件的字节流中包含的信息能够符合当前虚拟机的需求
  24. 检查文件中的信息是不是符合虚拟机的规范,有没有安全隐患
  25. |-2、准备
  26. 负责将类的类变量(static修饰的)分配内存,并且设置默认的初始化值。
  27. |-3、解析
  28. 把类的二进制数据流中的符号引用替换为直接引用。
  29. 如果当前类中引用了其他类,这个时候就需要找到对应的类。
  30. 3、初始化
  31. 根据我们通过程序指定的主管计划进行初始化类变量和其他的资源,
  32. 比如进行静态变量赋值,或者进行其他的初始化资源
  33. 类的加载过程:
  34. 1、把Student.java文件编译成Student.class文件字节码文件
  35. 2、拿到了字节码文件后,开始进入到【加载】阶段,通过包名.类名获取这个类。
  36. 并且把这个类加载到内存中。加载完成后创建一个Class对象。
  37. 3、进入【链接】阶段,链接阶段主要做3件事:验证、准备、初始化。
  38. 验证:检查一下
  39. 准备:提前把需要加载的类的静态变量这种先加载,并初始化默认值。
  40. 解析:把符号引用替换为直接引用。
  41. 4、进入到【初始化】阶段:完成初始化工作,比如对静态变量进行赋值
  42. 类的加载器分类:
  43. BootstrapClassLoader:Java虚拟机内置的类加载器,一般表示为null,并且没有父null。
  44. PlatformClassLoader:平台类加载器,负责加载JDK中的一些特殊的模块
  45. SystemClassLoader:系统类加载器,负责加载用户的类路径上指定的类库。
  46. 继承关系:
  47. SystemClassLoader的父加载器是PlatformClassLoader,
  48. PlatformClassLoader的父加载器是BootstrapClassLoader
  49. 双亲委派模型
  50. 如果一个类加载器收到了类加载请求,它绝不会自己先去加载,而是把这个请求委托给父类的加载器去执行。
  51. 如果父类的加载器还存在父类加载器,就会再次向上委托,依次递归,直到请求最终到达最顶层的启动类加载器。
  52. 如果父类加载器可以完成类加载任务,就成功返回。如果父类加载器不能完成任务,子类加载器才会尝试自己加载,
  53. 这就是双亲委派模式。