【问题标题】:ClassLoader.getSystemClassLoader() vs obj.getClass().getClassLoader().getSystemClassLoader()ClassLoader.getSystemClassLoader() 与 obj.getClass().getClassLoader().getSystemClassLoader()
【发布时间】:2019-05-30 22:17:48
【问题描述】:

这些完全相同吗:

ClassLoader.getSystemClassLoader() // 1

对比:

obj.getClass().getClassLoader().getSystemClassLoader() // 2
Person.class.getClassLoader().getSystemClassLoader()

是否存在可能产生不同结果的情况?

【问题讨论】:

    标签: java classloader


    【解决方案1】:

    根据ClassLoader.getSystemClassLoader() javadoc,这通常是用于启动应用程序的类加载器。 java.system.class.loader 属性可用于覆盖返回的类加载器,但是:

    在虚拟机几乎完全初始化之前,不会检查覆盖系统类加载器的系统属性。在启动期间执行此方法的代码应注意在系统完全初始化之前不要缓存返回值。

    在更复杂的设置中,obj.getClass().getClassLoader()Person.class.getClassLoader() 可以返回自定义类加载器,例如OSGI。返回系统类加载器完全取决于这个自定义类加载器。它 可能会选择不,例如因为它会绕过 OSGI boundle 类加载边界,请参阅this answer

    所以大多数时候它们应该是相同的,但没有什么能阻止您配置 JVM 或编写使它们不同的软件。

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2011-04-17
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      相关资源
      最近更新 更多