JVM学习笔记第6天-几种类加载器

加载器分类

JVM学习笔记第6天-几种类加载器

启动类加载器(引用类加载器)

1、使用c/c++实现;

2、用来加载java的核心库,JAVA_HOME/jre/lib/rt.jar、resource.jar或sun.boot.class.path路径下的内容,用于提供jvm自身需要的类;

3、并不继承自java.lang.ClassLoader ,没有父加载器;

4、加载扩展类和应用类加载器,并指定为他们的父类加载器;

5、出于安全考虑,只加载包名java、javax、sun开头的类;

扩展类加载器

1、Java语言实现,由sun.misc.laucher$ExtClassLoader实现;

2、派生于ClassLoader类;

3、父类加载器为启动类加载器;

4、从java.ext.dirs系统属性所指定的目录中加载类库,或从jdk的安装目录jre/lib/ext子目录下加载类库;如果用户创建的jar放在该目录下,也会自动有扩展类加载器加载;

应用程序类加载器

1、Java语言实现,由sun.misc.laucher$AppClassLoader实现;

2、派生于ClassLoader类;

3、父类加载器为扩展类加载器;

4、它负责加载环境变量classpath或系统属性 java.class.path 指定路径下的类库;

5、是程序中默认的类加载器,一般来说,Java应用类都是由它加载;

6、通过ClassLoader#getSystemClassLoader()可以获取到该类加载器;

自定义类加载器

1、可以自定义类加载器,一般继承ClassLoader抽象类;

2、为什么要自定义类加载器?

  • 隔离加载类
  • 修改类加载的方式
  • 扩展加载源
  • 防止源码泄露

获取ClassLoader的常用方法

1、获取当前类的ClassLoader

clazz.getClassLoader()

2、获取当前线程上下文的ClassLoader

Thread.currentThread().getContentClassLoader();

3、获取系统的ClassLoader

ClassLoader.getSystemClassLoader();

4、获取调用者ClassLoader

DriverManager.getCallerClassLoader();