类加载过程
首先,每个类都是一个最小的可以被加载运行在JVM进程中的独立单元。
要加载类,就要用到类加载器,每个类都指向一个类加载器,我们应用所需要的类加载器是Application ClassLoader(多例),每个Application ClassLoader都加载了属于它的互相关联的类。而根类加载器Bootstrap ClassLoader是平台独立的原生代码编写的。它会在JVM启动的时候自动加载运行环境需要的类。比如java.lang包下的类等。所有的类加载器构成了一颗树,每当要加载一个类的时候,基于双亲委托机制,优先询问父类是否已经加载或者让父类尝试加载,只有迭代到父类都失败的时候,当前类加载器才会去加载。
而之所以要用双亲委托,就是为了避免多次加载同一个类。比如:

从图中可以看出,不用双亲委托后,违背了每个类可以同时指向多个类加载器(父与子),并且还会出现重复加载,所以是不可行的。
类加载时机
上面说了加载的过程,但什么时候加载,一个类被加载的时机是什么时候?首先,一个类中使用到的其它类是动态加载的。而JVM执行字节码的时候遇到如下情况时会触发类的加载:
1)使用new关键字实例化类
2)读到一个类的静态字段(被final修饰、已在编译期把结果放在常量池的静态字段除外)
3)要设置一个类的静态字段(被final修饰、已在编译期把结果放在常量池的静态字段除外)
4)要调用一个类的静态方法
5)通过反射API访问这个类
ClassLoader树
ClassLoader树不仅可以用来加载类;它的另外一个重要作用是对各种请求的权限检查,无论是对限定资源的读写请求还是网络通信等,常用于各种安全场景中。
思考
如何控制一个类加载器?
文章转载自小谢backup,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




