目 录CONTENT

文章目录

16_类加载器重要方法详解

ByteNews
2019-08-19 / 0 评论 / 0 点赞 / 17,636 阅读 / 965 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-01-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

16_类加载器重要方法详解

findClass方法:

找到指定二进制名字的class,这个方法应该被类加载器重写,这个类加载器实现应该遵循委托模型去加载类。这个方法会被loadClass方法所调用(检查完父类加载器之后调用),默认实现只抛出一个ClassNotFoundException异常。

defineClass方法:

将一个字节数组转换成一个Class类的一个实例。在使用这个Class之前必须要被解析。

这个方法会分配一个默认的ProtectionDomain(保护域)给新定义的Class,这个ProtectionDomain是为了确保所返回来的Class的一切访问信息都是正确的。

这个默认的域是在第一次调用defineClass的时候被创建,在随后的调用当中可以被复用。

要想指定一个特定的ProtectionDomain(保护域),可以用defineClass的另一个重载的方法,可以接收一个ProtectionDomain作为参数传入。

参数:

  • name:期待的二进制的名字,如果不知道可以传null;
  • b:构成这个类数据的字节,处于off到len-1之间的范围应该符合class文件的格式,也就是符合JVM规范。
  • off:类数据的起始偏移量。
  • len:长度。

返回:

根据指定的类的数据所创建的一个Class对象。

loadClass(String name,boolean resolve)方法:

加载拥有指定的二进制名字的类。

这个方法的实现会按照如下顺序去寻找这个类:

  1. 调用findLoadedClass(String)方法去检查这个类是否已经被加载过。
  2. 调用父类加载器的loadClass方法,如果父类加载器是null,那么内建于虚拟机的类加载器就会被使用(使用根类加载器)。
  3. 调用findClass(String)方法去寻找这个类(自己定义的重写方法,默认实现是直接抛异常)。

如果类使用上述步骤被找到了,并且resolve参数为true,那么这个方法接下来会调用resolveClass(Class)方法(是对结果的类对象),这个类加载器的子类被鼓励去重写findClass方法,而不是直接去使用父类的findClass方法。

findClass方法除非被重写,否则getClassLoadingLock方法会在整个类加载的过程中同步这个结果。

0

评论区