Java-Classloader-loadeClass(String,boolean)、findClass(String)类加载源码解析
2017-10-08 10:22
841 查看
这里为了更好的说明类加载的过程,将部分次要代码删去,若有兴趣,可以自行查看Classloder源码
首先我们先来简述一下类加载的过程
使用findLoadedClass(name)方法查看该类是否已经被加载
如果该类未被加载过,则调用他的父类加载器,这里的父类加载器是扩展类加载器
扩展类加载器同样是继承ClassLoader类,因为它存在父类加载器就是引导类加载器,所以在执行loadClass方法时,同样会将加载委派给他的父类引导类加载器来执行
轮到引导类加载器的时候,由于它是加载器的最高一级,没有父类了,所以他就调用自身也就是引导类加载器的类加载方法
如果引导类加载不了,则会一层层往下退,先交给扩展类加载器,同理如果拓展类加载器还是加载不了,则会交给应用程序类加载类,如果还是加载不了,则最终会回到用户自定义的类加载器执行用户重写的findClass(String)方法
所以用户自定义类加载器的时候要重写findClass(String)方法而不是loadClass方法
首先我们先来简述一下类加载的过程
使用findLoadedClass(name)方法查看该类是否已经被加载
如果该类未被加载过,则调用他的父类加载器,这里的父类加载器是扩展类加载器
扩展类加载器同样是继承ClassLoader类,因为它存在父类加载器就是引导类加载器,所以在执行loadClass方法时,同样会将加载委派给他的父类引导类加载器来执行
轮到引导类加载器的时候,由于它是加载器的最高一级,没有父类了,所以他就调用自身也就是引导类加载器的类加载方法
如果引导类加载不了,则会一层层往下退,先交给扩展类加载器,同理如果拓展类加载器还是加载不了,则会交给应用程序类加载类,如果还是加载不了,则最终会回到用户自定义的类加载器执行用户重写的findClass(String)方法
所以用户自定义类加载器的时候要重写findClass(String)方法而不是loadClass方法
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { //同步锁保证类加载是线程安全的 synchronized (getClassLoadingLock(name)) { //查看该类是否已经被加载 Class<?> c = findLoadedClass(name); //该类未被加载过 if (c == null) { try { //当前加载器存在父类加载器 if (parent != null) { //调用委派的父类加载器执行该类的加载 c = parent.loadClass(name, false); } else { //当前加载器不存在父类加载器 //就委派最高级的引导类加载器来进行类的加载 c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } //如果父类加载器都执行不了 if (c == null) { // If still not found, then invoke findClass in order // to find the class //就调用自定义的类加载器来执行加载 c = findClass(name); } } //如果确认该类已经被加载,则直接链接到指定的类 if (resolve) { resolveClass(c); } return c; } }
//用户在自定义类加载器的时候通常需要继承java.lang.ClassLoader并重写该方法 //该方法会内loadClass(String,boolean)方法调用 protected Class<?> findClass(String name) throws ClassNotFoundException { throw new ClassNotFoundException(name); }
相关文章推荐
- 类路径分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 【Java】ClassLoader源码全面解析java类加载机制
- 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 【自己动手写类加载器2】覆盖findClass(String name)方法,删除bin目录下的加密的class文件
- 关于java从编译成class文件到加载再到初始化过程解析
- ClassLoader加载Class的过程 解析
- JVM类加载机制(ClassLoader)源码解析(3)
- Java源码解析-String详解
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- java ClassLoader机制和如何加载外部class文件(含代码)
- Gson解析报错 java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to XXX
- 【JDK】:java.lang.String、StringBuilder、StringBuffer 源码解析
- 源码解读:java 解析字符串为boolean四种实现方法的细节
- java String源码解析
- 源码分析 There is no getter for property named '*' in 'class java.lang.String
- 每天一到面试题 - 5 - Java - ClassLoader如何加载class
- ClassLoader如何加载class?—— Java经典面试题系列
- java代码实现利用 classloader 动态加载 jar包、文件夹到classpath中
- javacript 实现瀑布流原理和效果, 滚动加载图片【图文解析 附源码】