我改变了对比特币的看法
如何在两种存储引擎中进行选择?
系统文件存储层 到这里,我们应该明白,loadClass方法使用了模版方法模式,主线逻辑是双亲委派,但如何将class文件转化为Class对象的步骤,已经交由子类去实现。对模版方法模式不熟悉的同学,可以先参考我的另外一篇文章模版方法模式
其实源码中,已经有一个自定义类加载的样例代码,在注释中: 为什么要使用双亲委派机制,就使用当前的类加载器去加载不就行了吗?为啥搞得这么复杂呢? 假设现在并没有双亲委派机制,有这样的一个场景: 用户写了一个Student类,点击运行,此时编译完成后,虚拟机开始加载class,该class会由应用加载器进行加载,由于Object类是Student的父类,且双亲委派机制不存在的情况下,应用加载器就会自己尝试加载Object类,但是用户压根没定义Object,即应用加载器无法在加载范围搜寻到该类,所以此时Object类无法被加载,用户写的代码无法运行。 假设该用户自己定义了一个Object类,此时再次运行后,应用类加载器则会正常加载用户定义的Object与Student类。Student类中会调用System.out.print()输出Student对象,此时会由启动类加载器加载System类,在此之前同样也会加载Object类。 此时,方法区中有了两份Object的元数据,Object类被重复加载了! 倘若用户定义的Object类不安全,可能直接造成虚拟机崩溃或者引起重大安全问题。 如果现在使用双亲委派机制,用户虽然自己定义了Object类,可以通过编译,但是永远不会被记载进方法区。 双亲委派机制避免了重复加载,也保证了虚拟机的安全。 自定义类加载器 我们整理ClassLoader里面的流程
我们在ClassLoader里面找到findClass方法,发现该方法直接抛出异常,应该是留给子类实现的。 (编辑:吉安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |