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)方法:
加载拥有指定的二进制名字的类。
这个方法的实现会按照如下顺序去寻找这个类:
- 调用findLoadedClass(String)方法去检查这个类是否已经被加载过。
- 调用父类加载器的loadClass方法,如果父类加载器是null,那么内建于虚拟机的类加载器就会被使用(使用根类加载器)。
- 调用findClass(String)方法去寻找这个类(自己定义的重写方法,默认实现是直接抛异常)。
如果类使用上述步骤被找到了,并且resolve参数为true,那么这个方法接下来会调用resolveClass(Class)方法(是对结果的类对象),这个类加载器的子类被鼓励去重写findClass方法,而不是直接去使用父类的findClass方法。
findClass方法除非被重写,否则getClassLoadingLock方法会在整个类加载的过程中同步这个结果。
评论区