黑马程序员技术交流社区
标题:
请教类加载器的问题
[打印本页]
作者:
The_Wizard
时间:
2013-10-20 07:26
标题:
请教类加载器的问题
本帖最后由 The_Wizard 于 2013-10-22 08:37 编辑
可以自己写一个java.lang.System吗?老师说:通常不可以(类加载器的委托机制),不过撇开这个机制就可以了。想问下如何撇开这个机制?
作者:
奋斗@zbt
时间:
2013-10-20 11:34
Java虚拟机中可以安装多个类加载器,系统默认主要三个类加载器,每个类负责加载特定位置的类:BootStrap(内嵌在java虚拟机中由C++编写),ExtClassLoader,AppClassLoader。当然也可以自定义类加载器,自定义的加载器必须继承ClassLoader。
作者:
月夜之鬼魅
时间:
2013-10-20 17:08
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)
作者:
To
时间:
2013-10-20 19:12
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:
http://bbs.itheima.com/thread-89313-1-1.html
作者:
Simple_love
时间:
2013-10-20 19:57
是不可以,就算你自己写一个类加载器,Java虚拟几页不会用你写的类加载器去加载该类的,因为自定义类加载器是继承classLoader,也是就是说自定义的类加载器是AppClassLoader的子类,而且AppClassLoader又是BootStrap类加载器的子类的子类,由于类加载器的委托机制,子类父类 都可以加载System类时,这时Java虚拟就会调用父类加载去加载System,
作者:
The_Wizard
时间:
2013-10-21 07:25
是的,上面说的都太简单了。哥们,你说的挺对的,不过好像确实是可以的。我的方法是:在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了。其实我要问的就是我要说的这些,希望大家找找茬
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2