深入类加载器-类加载器作用,类缓存、类加载器的层次结构、ClassLoader类介绍、代理模式之双亲委派机制

来源:互联网 发布:广州多迪网络要交钱吗 编辑:程序博客网 时间:2024/05/22 10:41

1、类加载器的作用

类加载器的作用是将class字节码文件加载到内存中,并将这些静态数据转化为方法区中的运行时数据结构,同时在堆中生成代表这个类的java.lang.Class对象,作为访问方法区中数据的入口。

2、类缓存

标准的Java SE类加载器可以按要求查找指定的类,但是一旦某个类被加载到指定的类加载器中,它将维持一段时间,不过,JVM垃圾回收机制可以回收这些Class对象,简单的说,类在被回收前,只被加载一次

3、类加载器的层次结构

*注意:

a、只有引导类加载器没有继承java.lang.ClassLoader

b、只有引导类加载器是用C++写的,其他的类加载都是用java写的

c、自定义类的加载器的父类是应用程序类加载器,应用程序类加载器的父类是拓展类类加载,拓展类类加载的父类是引导类加载器,引导类加载器没有父类

d、注意这里所说的父类并不是继承的关系,内部的采用的组合的方式实现的
————————————————————————————

1. 引导类加载器(bootstrap class loader)

作用:

1、加载Java的核心库(JAVA_HOME/jre/lib/rt.jar)或sun.boot.class.path路径下的内容

2、加载扩展类和应用程序类加载器,并指定他们的父类

3、它是由原生程序C++写的,并不继承java.lang.Classloader

通过程序获取sun.boot.class.path路径下的内容

@org.junit.Test    public void test() {        System.out.println(System.getProperty("sun.boot.class.path"));    }

程序执行结果:

这里写图片描述

2、扩展类加载器(Extensions class loader)

1、用来加载java的扩展库(JAVA_HOME/jre/ext/*.jar)或java.ext.dirs路径下的内容,Java虚拟机会提供一个扩展库目录,该类加载器在这里查找并加载java类

2、由sun.misc.Launcher$ExtClassLoader实现

3、应用程序类加载器(application class loader)

1、根据Java应用的类路径来加载类,一般来说Java应用的类都是由它来加载的

2、由sun.misc.Launcher$AppClassLoader实现

4、自定义类加载器

1、开发人员可以通过继承java.lang.ClassLoader类来定义自己的类加载器已满足一些特殊的需求

4、ClassLoader类介绍

作用

  1. 加载字节码文件并生成对应的java.lang.Class对象

  2. 加载Java应用所需要的资源,如图像和配置文件

相关方法

方法 解释 getParent() 返回该类加载器的父类加载器 loadClass(String name) 加载返回名称为name的java.lang.Class实例 findClass(String name) 找到并返回名称为name的java.lang.Class实例 findLoadedClass(String name) 查找并返回已经加载过的名称为name的java.lang.Class实例 defineClass(String name,byte[]b,int off,int len) 方法为final不能被重写,通过byte字节数组生成并返回名称为name的java.lang.Class实例

*注意

  1. 上面方法参数中的name指定的是类的二进制名,需要注意的是内部类的表示,com.maple.example$Test表示内部类Test

5、代理机制之双亲委派机制

解释:

某个类加载执行类加载请求时,先将该请求交给父类,父类再交给父类的父类,知道最高级父类,到达最高级父类时,他会判断我能不能加载这个类,如果能,则加载成功返回,如果不能,则交给他的一级子类重复以上的操作,知道这个类最后被成功加载

作用:

保证了Java核心库的类型安全,这种机制也是java很重要的安全屏障

阅读全文
0 0
原创粉丝点击