这些完全相同吗?
ClassLoader.getSystemClassLoader() // 1
vs:
obj.getClass().getClassLoader().getSystemClassLoader() // 2
Person.class.getClassLoader().getSystemClassLoader()
是否存在可能产生不同结果的情况?
答案 0 :(得分:2)
根据ClassLoader.getSystemClassLoader()
javadoc,这通常是用于启动应用程序的类加载器。 java.system.class.loader
属性可用于覆盖返回的类加载器,但是:
在虚拟机几乎完全初始化之前,不会检查覆盖系统类加载器的系统属性。在启动过程中执行此方法的代码应注意不要在系统完全初始化之前不缓存返回值。
在更复杂的设置中,obj.getClass().getClassLoader()
或Person.class.getClassLoader()
可以返回自定义类加载器,例如OSGI。这个自定义类加载器完全取决于返回系统类加载器。它
可能不选择因为它将绕过OSGI边界类的加载边界,请参见this answer。
因此大多数情况下它们应该是相同的,但是没有什么可以阻止您配置JVM或编写会使它们与众不同的软件。