1.类加载的顺序
加载,验证,准备,解析,初始化,使用,卸载
1.1.加载
当程序中用到这个类的时候才会去加载
1.2.验证
加载进来的.class文件是否满足指定的一些规范
1.3.准备
给被加载进来的类分配一定的内存空间,给里面的类变量也分配内存空间,并且给一个默认的初始值
1.4.解析
主要是把一些符号引用替换成直接引用
1..5.初始化
针对准备阶段的类变量引用的值做一个实例化赋值
例如A a = new A();
在准备阶段只是给一个null值,在初始化的时候才会在堆内存中创建对象赋值给a
1.6.除开main函数,什么时候会加载一个类?
当有new A();的时候就会去加载这个类,然后完成这个类的一系列加载生成实例后返回给上一个类变量
main函数存在的主类,必须是立马初始化的
初始化一个类时,如果发现他的父类还没有初始化,那么会先去初始化他的父类
2.类的加载器
启动类加载器(Bootstrap ClassLoader):加载java中/lib下的类
拓展加载器(Extension ClassLoader):加载java中lib/ext下的
应用程序加载器(Application ClassLoader):加载ClassPath指定路径下的类
自定义加载器
2.1.双亲委派机制
最底层的加载器是自定义加载器
加载时最底层的加载器就问爸爸application ClassLoader
你丫能加载么,application ClassLoader就在自己负责的文件夹里找相应的类找不到就问
Extension ClassLoader...一直往上问
假设一直没有找到到顶之后,就会往下问,
最高层的加载器BootStrap ClassLoader就说我这儿没有,你看下你那里有没有
一层一层的问下来
这样的机制自下而上为了避免重复加载,自上而下
3.拓展 如何混淆加密jar包
.java类可以编译成.class类,那么.class肯定是可以翻译到.java类的
首先把编译好的jar包通过一些字节码加密或者混淆,然后使用自定义类加载器来加载jar包
4.tomcat下类加载器加载顺序