olivierqiu 2011-02-01 07:32
浏览 166
已采纳

请教大家一些ClassLoader的问题

Thread t = new Thread() {
public void run() {
try {
Class.forName("test.User");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("child thread:"

  • Thread.currentThread().getContextClassLoader()); } }; t.setContextClassLoader(null); t.start(); 我在这个线程启动之前把context类加载器设置为bootstrap了,那么run方法第一句加载test。User为什么会成功呢?bootstrap加载器没有父加载器了,它尝试加载User类,而这个类是我自己写的,不是在rt.jar中的,那么为什么会成功加载呢?User类不应该由应用加载类加载的吗?

2.还有一个问题,是core java下册中的内容,我不清楚是不是译者的翻译没有到位的问题,他说:
偶尔,你也会需要干涉和指定类加载器,考虑下面的例子:
*你的应用代码包含一个助手方法,他要调用Class.forName(classNameString)
*这个方法是从一个插件类中被调用的。
*而classNameString指定的正是一个包含在这个插件的jar中的类。

我想象的代码结构可能是这样的。
Class Test{
main(){
Util.foo();
}
}

class Util{
public static void foo(){
Class.forName(classNameString);
}
}
然后他说,插件的作者很合理的期望这个类应该被加载,但是,助手方法的类是由系统类加载器(即应用类加载器)加载的。这正是Class.forName所使用的类加载器。而对于他来说,在插件JAR中的类是不可视的,这种现象称为类加载器倒置。
我最后一句话没读懂,如果在eclipse下把插件的jar build进来,不就可以访问到插件中的类了吗?为什么要干涉和指定类加载器?

展开全部

  • 写回答

2条回答 默认 最新

  • rednaxelafx 2011-02-02 07:09
    关注

    [quote="sakop"]没想到contextClassLoader原来是给容器用的,java core实现中几乎不使用它。第二个问题我也搞明白了。 [/quote]
    不啊,Java的核心库里有不少使用了service provider机制的地方都使用到了context class loader。可以留意一下包名是spi结尾的那些。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 ROS怎么连接PIXHAWK2.4.8和Jetson Nano怎么连接
  • ¥15 pycharm倒入虚拟环境的时候,显示这个,但是我的虚拟环境已经创建了
  • ¥15 FPGA芯片60进制计数器
  • ¥15 前端js怎么实现word的.doc后缀文件在线预览
  • ¥20 macmin m 4连接iPad
  • ¥15 DBIF_REPO_SQL_ERROR
  • ¥15 根据历年月数据,用Stata预测未来六个月汇率
  • ¥15 DevEco studio开发工具 真机联调找不到手机设备
  • ¥15 请教前后端分离的问题
  • ¥15 下载honeyd时报错 configure: error: you need to instal a more recent version of libdnet
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部