在ClassLoader中,defineClass、findClass和loadClass方法各自承担什么角色?
defineClass()
, findClass()
, 和 loadClass()
是 ClassLoader
类中的方法,它们在类加载过程中起到了不同的作用。
defineClass()
: 这个方法是将字节数组转换为Class
对象。这个方法是受保护的,通常情况下我们不会直接调用它。它在类加载器实现中使用,通常在自定义类加载器中,我们会在findClass()
方法中调用defineClass()
。-
findClass()
: 在自定义类加载器中,我们通常需要覆写这个方法。当父类加载器无法找到类时,会调用子类加载器的findClass()
方法。在这个方法中,我们通常需要把类的二进制数据读取到字节数组中,然后调用defineClass()
方法将其转换为Class
对象。 -
loadClass()
: 这是类加载的入口点。当我们调用ClassLoader
的loadClass()
方法时,它首先会尝试在已加载的类中查找,如果找不到,就会委托给父类加载器来加载,如果父类加载器也无法加载,就会调用findClass()
方法来尝试加载。在双亲委派模型中,这个方法扮演了关键的角色。
这三个方法的工作原理和协同方式是类加载的基础,理解它们有助于我们更好地理解Java的类加载机制。