ClassLoader.getSystemClassLoader() 与 obj.getClass().getClassLoader().getSystemClassLoader()

use*_*718 5 java classloader

这些是否完全相同:

ClassLoader.getSystemClassLoader() // 1
Run Code Online (Sandbox Code Playgroud)

对比:

obj.getClass().getClassLoader().getSystemClassLoader() // 2
Person.class.getClassLoader().getSystemClassLoader()
Run Code Online (Sandbox Code Playgroud)

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

Kar*_*cki 3

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

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

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

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