【问题标题】:Confusion in class loading styles类加载样式的混乱
【发布时间】:2014-04-24 07:05:38
【问题描述】:

正如我在一个线程 Java: Difference between Class.forName and ClassLoader.loadClass 中发现的那样,Class.forName() 将始终使用调用者的 ClassLoader,而 ClassLoader.loadClass() 可以指定不同的 ClassLoader

System.out.println(Class.forName("test.Employee").getClassLoader());
System.out.println(ClassLoader.getSystemClassLoader().loadClass("test.Employee").getClassLoader());

但是上面两行打印的结果是一样的

sun.misc.Launcher$AppClassLoader@7ced01
sun.misc.Launcher$AppClassLoader@7ced01

请说明原因。

【问题讨论】:

  • 为什么期望结果会有所不同?
  • 如果两种样式的类加载器不同,那么应该有两个不同的对象。
  • 使用不同的类加载器加载类并比较类对象(不是类实例)是否相等。你会得到答案
  • @WhoAmI 我的问题不是针对 Employee 类对象的相等性,而是针对类加载器的对象。
  • 在这两种情况下?那么调用者的类加载器是什么?

标签: java


【解决方案1】:

这对您来说没有什么不同,因为您当前的类是使用 SystemClassLoader 加载的,恰好是 sun.misc.Launcher$AppClassLoader@7ced01

如果您使用不同的类加载器来加载一个类,那么在您使用不同的类加载器加载的那个类中使用时,两种方法都将使用不同的类加载器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多