A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Mr_Free 中级黑马   /  2013-8-23 21:12  /  1086 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

       我对类加载器的委托机制的理解,就是每次加载类,优先找其父类的类加载器,然后再找爷爷,一直找到BootStrap里面rt.jar,看能不能加载这个类,如果不能的话,在去找这个类加载器的发起者,如果还找不到的话就报异常。我是不是能理解为就用到了2个类加载器。
一个是其类加载器本身,一个是BootStrap中。那么 为什么还要中间的一些加载器?这样一级一级找岂不麻烦?直接弄个连链接给BootStrap不就行了?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 xuluheng718 于 2013-8-23 21:28 编辑

JAVA这是为了安全考虑,因为每次寻找类时都是先委托父加载器寻找,所以除非有人可以入侵计算机,置换掉标准API与相关的延伸包,否则不可能通过写的自己的类加载器来载入恶意类,以置换掉标准API与相关的延伸包,打个比方说吧:假如没有委托机制,我自己写个类加载器,然后我还写了个System类,那么我就可以用我自己写的类加载器加载我自己写的System类,而你想使用API中的System类时候,就会使用我写的System类了。这样是不是出了安全隐患呢?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
我明白你的意思,其实是这样的,自顶向下加载是正确的,但是之前还有一步,那就是自低向上查找是否已经被加载。

首先是发起委托的类的类加载器,如果这个类加载器没有加载过需要加载的类,那么找上一级,看看上一级是否已经加载过你需要加载的类,如果已经加载过,就可以直接拿来用了,如果没加载过再继续往上找。如果沿途的类加载器都之前都没有加载过这个类,那么最终会委托到bootstrap,让bootstrap来进行加载。

然后bootstrap就试着加载了呗,但是他在自己的地盘不一定能找到需要加载的类的字节码文件,所以他就让他的子类加载,这样一步一步向下尝试,直到某个加载器在自己的地盘找到了需要被加载的那个类的字节码文件,就加载成功了。如果一直找到发起委托的类加载器还是没有找到需要的字节码文件,就会报异常。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
小冰块 发表于 2013-8-24 00:05
我明白你的意思,其实是这样的,自顶向下加载是正确的,但是之前还有一步,那就是自低向上查找是否已经被加 ...

这个 没有getChild方法的吧,只有getParent方法,所以不存在一级一级找下去的动作吧,如果BootStrap没找到,直接回到发起者里面找,没有就报错?
回复 使用道具 举报
不需要你去找,这个动作是虚拟机自己完成的。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
{:soso_e176:}
亲,请问下问题是否解决?
如果已解决请及时将未解决改为已解决
如果未解决请回帖追问
三天未回复的将视为已解决
详情参考:如何更改分类

保持队形,谢谢合作
{:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马