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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© The_Wizard 中级黑马   /  2013-10-20 07:26  /  1399 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 The_Wizard 于 2013-10-22 08:37 编辑

可以自己写一个java.lang.System吗?老师说:通常不可以(类加载器的委托机制),不过撇开这个机制就可以了。想问下如何撇开这个机制?

评分

参与人数 1黑马币 +3 收起 理由
周志龙 + 3 赞一个!

查看全部评分

5 个回复

倒序浏览
Java虚拟机中可以安装多个类加载器,系统默认主要三个类加载器,每个类负责加载特定位置的类:BootStrap(内嵌在java虚拟机中由C++编写),ExtClassLoader,AppClassLoader。当然也可以自定义类加载器,自定义的加载器必须继承ClassLoader。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
ClassLoader 类使用委托模型来搜索类和资源。每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader 实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。
开发者可以通过扩展ClassLoader的子类,并重写该ClassLoader所包含的方法来实现自定义的类加载器
ClassLoader类有如下三个关键方法:
loaderClass(String name,Boolean resolve):
findClass(String name)
ClassLoader类还有一个核心方法:Class defineClass(String name,byte[] b,int off,int len)

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-20 19:12:07
板凳
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
是不可以,就算你自己写一个类加载器,Java虚拟几页不会用你写的类加载器去加载该类的,因为自定义类加载器是继承classLoader,也是就是说自定义的类加载器是AppClassLoader的子类,而且AppClassLoader又是BootStrap类加载器的子类的子类,由于类加载器的委托机制,子类父类 都可以加载System类时,这时Java虚拟就会调用父类加载去加载System,
回复 使用道具 举报
是的,上面说的都太简单了。哥们,你说的挺对的,不过好像确实是可以的。我的方法是:在eclipse中操作,先自己定义一个类加载器MyClassLoder。在工程中新建一个文件夹itcast,将前面自己已经写了java.lang.System的字节码文件复制进去;然后这样调用好像就可以了:Class clazz = new MyClassLoader("itcast").loadClass("java.lang" + "System"); 这时System会被BootStrap加载,这个不是自己写的System。如果去掉注释掉 "java.lang" + ,此时没有完整的路径,应该是没有完整的类名,进入委托机制那些父级的加载器自然不会去加载 java.lang.System(rt.jar中的)。最后回到自己定义的类加载器(因为由它发起),就由它加载了自己定义的java.lang.System了。其实我要问的就是我要说的这些,希望大家找找茬
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马