类加载器概述
主要的作用是将 class 文件加载到 jvm 虚拟机中。jvm 启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式加载和显示加载。
-
隐式加载:
程序代码中不通过调用 ClassLoader 来加载需要的类,而是通过 JVM 类自动加载需要的类到内存中。例如,当我们在类中继承或者引用某个类的时候,JVM 在解析当前这个类的时,发现引用的类不在内存中,那么就会自动将这些类加载到内存中。 -
显示加载:
代码中通过 Class.forName(),this.getClass.getClassLoader.LoadClass(),自定义类加载器中的 findClass()方法等。
加载机制
Java 默认提供的三个 ClassLoader
- BootStrap ClassLoader:
主要加载 %JRE_HOME%\lib 下的 rt.jar、resources.jar、charsets.jar 和 class 等。
可以通过 System.getProperty("sun.boot.class.path")查看加载路径 - EtxClassLoader
主要加载目录 %JRE_HOME%\lib\ext 目录下的 jar 包和 class 文件。
可以通过 System.out.println(System.getProperty("java.ext.dirs"))查看加载路径 - AppClassLoader
主要加载当前应用下的 classpath 路径下的类。之前我们在环境变量中配置的 classpath 就是指定 AppClassLoader 的类加载路径。
类加载器的继承关系
双亲委派模式
双亲委派模式指 ClassLoader 会先交由父加载器加载,由上而下依次检查,如最后自己也找不到类,则抛出 ClassNotFoundException 异常
双亲委派的好处
带有层级关系,可避免重复加载
自定义类加载器
当 class 文件不在上述加载器的目录范围内是,则使用自定义加载器
package test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class MyClassLoader extends ClassLoader{ private String classpath; public MyClassLoader(String classpath) { this.classpath = classpath; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { try { byte [] classDate=getDate(name); if(classDate==null){} else{ //defineClass方法将字节码转化为类 return defineClass(name,classDate,0,classDate.length); } } catch (IOException e) { e.printStackTrace(); } return super.findClass(name); } //返回类的字节码 private byte[] getDate(String className) throws IOException{ InputStream in = null; ByteArrayOutputStream out = null; String path=classpath + File.separatorChar + className.replace('.',File.separatorChar)+".class"; try { in=new FileInputStream(path); out=new ByteArrayOutputStream(); byte[] buffer=new byte[2048]; int len=0; while((len=in.read(buffer))!=-1){ out.write(buffer,0,len); } return out.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally{ in.close(); out.close(); } return null; } }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于