1、class文件分析
https://zhuanlan.zhihu.com/p/81400366
2、符号引用,直接引用
符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可,使用符号引用时,被引用的目标不一定已经加载到内存中。
直接引用可以是直接指向目标的指针,相对偏移量,一个能间接定位到目标的句柄,使用直接引用时,引用的目标必定已经存在于虚拟机的内存中了。
为什么在解析阶段要符号引用转直接引用?
个人理解,如果使用符号引用,虚拟机其实也不知道具体引用的类的内存地址,那么也就无法真正的调用到该类,所以要把符号引用转为直接引用,这样就能够真正定位到类在内存中的地址,如果符号引用转直接引用失败,就说明类还没有被加载到内存中,就会报错。
3、图形拓展
4、双亲委派机制(含源码解析)
https://blog.csdn.net/codeyanbao/article/details/82875064
5、为什么还需要自定义类加载器??
1 从非标准来源加载代码:由于系统提供的类加载器均加载的是指定目录,所以当我们需要加载非系统指定目录如C:/xx/xxxx.class时需要自定义类加载器、数据库、云端等。
2 加密:将编译后的代码加密,然后用自定义类加载器去先解密,然后再加载。
6、类加载器的分类
-
启动类加载器(Bootstrap ClassLoader): 负责将存放在 <JAVA_HOME>\lib 目录中的,并 且能被虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中 也不会被加载)类库加载到虚拟机内存中。
-
扩展类加载器(Extension ClassLoader): 负责加载 <JAVA_HOME>\lib\ext 目录中的所有 类库,开发者可以直接使用扩展类加载器。
-
应用程序类加载器(Application ClassLoader): 由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,所以一般也称它为“系统类加载器”。它负责加载用 户类路径(classpath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程 序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
7、类加载过程
8、class文件结构
9、什么是魔数?
在计算机领域,魔数有两个含义,一指用来判断文件类型的魔数;二指程序代码中的魔数,也称魔法值。
10、类加载器的作用?
https://blog.csdn.net/studyvcmfc/article/details/7720322
11、javap
https://blog.csdn.net/weixin_44082567/article/details/86081531