Java_类加载机制与反射

101 阅读2分钟

ch18_类加载机制与反射

参考学习源码:github源码_类加载机制与反射

18.1 类的加载、连接和初始化

1、当Java程序运行结束时,JVM进程结束,该进程在内存中的状态将会丢失。
2、类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象。
3、类加载后,接着会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中。包括:验证——验证被加载的类是否有正确的内部结构;准备——负责为类变量分配内存,并设置初始值;解析——将类的二进制数据中的符号引用替换成直接引用。

18.2 类加载器

1.Bootstrap ClassLoader:根类加载器,负责加载JVM核心类,并不是java.lang.ClassLoader的子类,而是由JVM自身实现的。
2.Extension ClassLoader:扩展类加载器,负责加载JRE的扩展目录中JAR包中的类。
3.System ClassLoader:系统类加载器,负责在JVM启动时加载来自java命令的-classpath选项。

4.JVM的类加载机制

  • 全盘负责。
  • 父类委托。
  • 缓存机制。保证所有加载过的Class都会缓存,当程序使用某个Class时,类加载器先从缓冲区搜索该Class,只有当缓冲区不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换为Class对象,存入缓存区中,这就是为什么修改了Class后,必须重启JVM,程序所做的修改才会生效的原因。

18.3 反射

编译时根本无法预知该对象的类和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,这时就用到了反射。

1、获得Class对象的三种方式:

  • 使用Class类的forName(String clazzName)静态方法。
  • 调用某个类的class属性来获取该类对应的Class对象。代码更安全(程序在编译阶段就可以检查所访问的Class对象是否存在);程序性能更好(无须调用方法)。
  • 调用某个对象的getClass()方法。