本文重点
前面的课程中,我们已经学习了双亲委派机制,如果想要自定义一个类加载器,那么我们只需要继承ClassLoader,并且定义好自己的findClass就可以了,也就是自己的类加载器是如何进行工作的,而loadClass就是双亲委派机制,我们直接使用ClassLoader的就可以了,这样就没有破坏双亲委派机制。
自定义类加载器
Shiy这个类因为没有放在当前目录下,所以调用loadClass(packageNamePath)的时候,仅仅传递了类的名字,App加载器加载不到,所以此时就会通过双亲委托机制最后还是落到我们自定义的类加载器手里,而我们的自定义类加载器知道绝对路径,所以肯定可以找到它并且加载,也就是调用findClass方法,下面我们看一下它的逻辑:
如上所示就是读取class文件,并且将其转变为二进制byte数组中,然后调用defineClass方法就可以将byte数组转变为class对象了,此时加载工作完成。
注意点
需要保证在D盘下有一个Shi.class对象,一般我们都是在编译工具中进行编程,那么我们只需要找到编译工具中java类对应的class文件,那么我们就可以对其进行加载了。代码如下:
如上所示,我们在idea中编程,然后在com.huanfeng.bean中创建了一个Hello类,然后idea会自动在C:\Users\feng\IdeaProjects\spring2\target\classes\com\huanfeng\bean路径下产生class,那么我们只需要给定这个class路径,那么类自动加载器就可以帮助我们完成类的加载工作。