免费注册域名和空间/百度优化关键词
经过了一段时间的学习,现在又回头来补一下早先的知识了。
类加载器
作用:加载Class文件 -> new Student();
可以从上图看出,那么,这些实例应该都由一个类加载创造,我们也可以通过代码来看
public class Dog {public static void main(String[] args) {Dog dog1 = new Dog();Dog dog2 = new Dog();Dog dog3 = new Dog();System.out.println(dog1.hashCode());System.out.println(dog2.hashCode());System.out.println(dog3.hashCode());Class<? extends Dog> Class1 = dog1.getClass();Class<? extends Dog> Class2 = dog2.getClass();Class<? extends Dog> Class3 = dog3.getClass();System.out.println(Class1.hashCode());System.out.println(Class2.hashCode());System.out.println(Class3.hashCode());}
}
通过此代码运行的结果可以看出,Class1,Class2,Class3的hashCode一致
那么顺带着两者问题
1.不同的类加载器,除了读取二进制流的动作和范围不一样,后续加载的逻辑是否也不一样?
2.遇到限定名一样的类,这么多的加载器会不会产生混乱?
默认情况下,一个限定名的类只会被一个类加载器加载解析并使用,这样的程序中,他就是唯一的,不会产生歧义的
于是引入了双亲委派机制
当一个类受到加载请求,不会自己去加载,而是会传递给自己的父亲加载器(并非继承关系),这样所有的类都会先传到上层的Bootstrap ClassLoader。只有父亲加载器无法加载,儿子加载器才会尝试自己加载
什么是 无法加载?
根据类的限定名,类没有在自己负责的加载路径中找到该类。
我们此时回答以上两个问题
1.我们认为除了Bootstrap ClassLoader,所有的非Bootstrap ClassLoader都继承了java.lang.ClassLoader,都由这个类的defineClass进行后续处理
2.越核心的类库被越上层的类加载器加载,而某限定名的类一旦被加载过了,被动情况下,就不会再加载相同限定名的类。这样 ,就能够有效避免混乱