类加载器的重要作用:通过一个类的全限定名来获取该类的二进制字节流,实现这个过程的就是类加载器(Class Loader)。
Jvm中有三种类加载,分别是启动类加载器(Bootstrap Class Loader)、扩展类加载器(Extension Class Loader)、应用步调类加载器(Application Class Loader),此中启动类加载器是C++实现,因此启动类加载器不能在java中获取。 启动类加载器(Bootstrap Class Loader):负责加载\lib目次下的核心类库。 扩展类加载器(Extension Class Loader):负责加载\lib\ext目次下的扩展类库。 应用步调类加载器(Application Class Loader):负责加载用户类路径(classpath)下的全部类库。
java应用步调都是由这三种类加载器相互共同来实现类的加载,它们直接的关系如下图所示:
这种工作模式被称为类加载器双亲委派机制,它们的实行流程是:当某一个类要被加载时,当前类的加载器会先查抄自己是否已经加载过这个类,假如没有加载过,就会委派给父类加载器(直到最顶级的类加载器),假如父类加载器加载失败,那么子加载器才会去加载该类。
双亲委派的长处:
1.沙箱安全机制,制止核心的类库被窜改,假如我们自己也界说一个String类,那么类加载器是不会加载的。
2.制止重复加载类似的类。
类和类加载器的关系:在java中,同一个类被差别的类加载器加载,那么这两个类也不类似。
3.对象内存分配
// test1中user逃逸出test1方法
public User test1() {
User user = new User();
user.setId(1);
user.setName("test");
return user;
}
// test2中user没有逃逸出去
public void test2() {
User user = new User();
user.setId(1);
user.setName("test");
}