【问题标题】:How is the system classloader in java useful?java中的系统类加载器有什么用?
【发布时间】:2012-11-11 08:54:35
【问题描述】:

我希望系统类加载器接管我的应用程序的类加载。所以,如果我运行我的程序,

java -Djava.system.class.loader=MyClassLoader Main

我希望 Main 由 MyClassLoader 加载,以便我可以控制应用程序中的类加载。但这不会发生。 Main 仍由默认系统类加载器 (sun.misc.Launcher$AppClassLoader) 加载,Main 引用的其他类也是如此。但是,对 getSystemClassLoader() 的调用会返回 MyClassLoader 的一个实例。

这有什么用?由我的自定义系统类加载器加载 Main 是否有意义?如何控制我的应用程序的类加载?谁使用 getSystemClassLoader() 值?

【问题讨论】:

  • 有些东西必须加载你的类加载器......那就是系统类加载器(它神奇地位于 JVM 内部)。
  • 你是如何实现你的类加载器的?您可能会委托给父母吗?
  • 好的,所以你没有从头开始编写它,但它仍然是你的类。您必须首先反驳这个假设:您的类加载器正在被调用,但它委托给父类加载器
  • 您能提供一个最小的工作示例吗?
  • 请贴出你的ClassLoader的代码

标签: java classloader


【解决方案1】:

如果您只是将URLClassLoader 子类化而没有覆盖,this is the documented behaviour you should expect

首先在父类加载器中搜索后,将按照为类和资源指定的顺序搜索 URL。

如果父类加载器可以加载该类,那么它会这样做,并且为该类报告的加载器将是父类加载器。为了恢复这个 parent-first 作为 Java 类加载器默认的类加载策略,您必须覆盖 loadClass

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 2023-03-12
    • 2015-01-04
    • 2014-10-18
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多