有几本书上在介绍类加载器的用户自定义类加载器时说覆盖loadClass方法,比如李刚的《疯狂java讲义》,实际上这种覆写loadClass方法的做法是不提倡甚至是错误的。
看看JDK源码就可知类加载器的类继承结构:抽象类ClassLoader<-----SecureClassLoader<----URLClassLoader,除了引导类加载器Bootstrap ClassLoader是底层本地方法用C++实现的以外,其他所有类加载器都是ClassLoader的后代。
不能覆写loadClass方法的原因:
第一,双亲委托机制不允许破坏loadClass方法。假如覆盖这个方法破坏了双亲委托机制,例如一个类A只是Object的子类,那么加载这个类时由于破坏了双亲委托机制,那么其父类Object的加载检查不能完成,何况类A自身的加载,那轮都轮不到。在加载Object等父类和其他核心类的时候就会提示找不到路径的异常或者错误。
第二,JDK源码中SecureClassLoader URLClassLoader两个类都没有覆写抽象类ClassLoader的loadClass方法,JDK示例代码用户自定义类加载器要覆写的是findClass方法。
getInstance()方法,new ,反序列化是得到实例的几种方式,getInstance()方法是一个本地方法。