想了解验证过程的,可以看看双亲委派机制,这个文章:类加载器 and破坏双亲委派模型实现
class文件组成
首先看一看类文件的组成部分:
总结一下就是:
1、cafe babe 作为magic num |
2、版本号:主版本号,次版本号 |
3、类信息(public、final、enum等标示信息) |
4、Constant Pool,#1 #2之类的,第一个代表一共有多少个常量,后面接着就是常量了 |
5、字段 Field |
6、方法 Method |
7、属性 attributes |
基本上每个类都是这样的,只要是被编译后的class文件都是这样的,JVM就是处理这些class文件,JVM读的其实是经过加工的,变为符合特定规则的class文件,这才是JVM可以阅读的类。
这里可以参考一篇文章:
《class文件浅析》https://www.cnblogs.com/noteless/p/9540876.html
JVM启动过程
1、启动JVM虚拟机,先创建出package sun.misc.Laucher实例
2、Laucher构造方法中看到,loader包装/创建了App、Ext两个类加载器
3、由getClassLoader返回loader对象(不仅仅内含AppClassLoader)
1、创建launcher实例:
2、Laucher创建loader对象
public ClassLoader getClassLoader() {
return loader;
}
双亲委派模型优点:
看看它有啥优点吧,Java字节码文件刚进来就执行这么个方法,那么这么设计必然有其优越性。这里就体现在了——安全性上。沙箱机制
第一次进来的类文件,总是要先过问更高级的类加载器,然后再一级一级下来,直到在类加载器的类路径中找到同全限名的类为止。
保证了核心的类被更高级的类加载器加载,而用户自定义的加载器也无法对Java程序进行程序注入等错误。
而第二次进来就直接去加载器里面找,凡是加载过的都能马上找到,所以也保证了效率。(其他的优点待补充……)
参考:
-
《class文件浅析》https://www.cnblogs.com/noteless/p/9540876.html
-
关于类加载器 and破坏双亲委派模型实现:类加载器 and破坏双亲委派模型实现