JVM自带的类加载器:其关系如下:其中,类加载器在加载类的时候是使用了所谓的“父委托”机制。默认该方法的实现是抛出了一个ClassNotFoundException异常。当执行loader3.loadClass时,先由它上层的所有父类加载器尝试加载Sample类。在Sample类中主动使用了Dog类,当执行Sample类的构造方法中的new Dog()语句时,JVM需要先加载Dog类,到底用哪个类加载器家在呢?从上述的打印结果中可以看出,加载Sample类的loader1还加载了Dog类,JVM会用Sample类的定义类加载器去加载Dog类,加载过程中也同样采用了父亲委托机制。这又牵扯到命名空间的问题。在MyClassLoader类的main方法中使用Sample类,会导致NoClassFoundError错误。当两个不同命名空间内的类相互不可见时,可采用Java反射机制来访问对象实例的属性和方法。利用反射机制,我们可以跨越这种命名空间的限制。
暂无评论