熟悉双亲委派机制的小伙伴们,应该也知道其在java专业领域的重要性,所以如果想要更加了解该机制,或许我们可以看看双亲委派机制的一些面试题。
java的类加载机制是怎样的呢?什么是双亲委派原则呢?
答案:java的类加载过程分为:加载,链接,初始化。
加载:即从数据源(jar,class,网络)加载class文件到jvm,映射为class对象,如果不是classFile结构,就会抛出ClassFormatError的;
链接:把第一步得到的class对象转换到jvm环境了,进行验证(主要是看字节信息是否符合jvm规范,否则就会抛出VerifyError),准备(为静态变量分配内存的空间),解析(常量池里面的符号引用替换为直接引用了);
初始化:就是为静态变量和静态代码块赋值了。
能不能自己写个类叫java.lang.System呢?
答案:通常是不可以的,但是可以采取另类的方法去去达到这个需求。
解释:为了不让我们写System类,类加载采用了委托机制,这样就可以保证父类优先了,父类能找到的类,子类就应该没有机会去加载了。而System类就是Bootstrap加载器加载的,就算是自己重写了,也总是使用Java系统提供的System的,自己写的System类根本没有机会得到加载的。
但是呢,我们可以自己定义一个类加载器来达到这个目的,为了避免双亲委托机制,这个类加载器就也必须是特殊的。由于系统自带的三个类加载器都加载特定目录下的类,如果我们自己的类放在一个特殊的目录里面,那么系统的加载器就无法加载了,也就是最终还是由我们自己的加载器去加载了。
委托机制具体含义如下所示:
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类(我们假设为类A)。
注意哦:当前线程的类加载器是可以通过Thread类的getContextClassLoader()去获得的,也可以通过setContextClassLoader()方法自己设置类加载器的。
如果是类A中引用了类B,那么Java虚拟机将使用加载类A的类加载器去加载类B。
还可以直接去调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
那么以上就是本篇文章的所有内容了,还想了解更多面试题知识记得关注本站消息哦。
推荐阅读: