【问题标题】:Why does classname$1.class generate in this situation? [duplicate]为什么在这种情况下会生成 classname$1.class? [复制]
【发布时间】:2013-06-09 04:57:55
【问题描述】:

我编写了以下代码来实现单例模式:

public final class Test {
     static final class TestHolder {
         private static final Test INSTANCE = new Test();
     }     

     private Test() {}

     public static Test getInstance() {
         return TestHolder.INSTANCE;
     }
}

当我编译这个文件时,它应该生成Test.class 和Test$TestHolder.class,但它也会生成Test$1.class。这没有意义。那么为什么会这样?

【问题讨论】:

  • @sircapsalot 问题是匿名类在哪里
  • 这类问题值得投票。
  • 我在这里没有得到 Test$1.class 文件(JDK 7 或 6)。还有人吗?
  • 是的,javac 1.6.0_45 在我的 Mac 上创建它,我在下面解释了它的用途。

标签: java compilation


【解决方案1】:

TestHolder需要调用Test中的私有构造函数。但它是私有的,实际上不能从另一个类中调用。所以编译器玩了一个把戏。它Test 添加了一个只有它自己知道的新的非私有构造函数! 该构造函数采用了这个匿名类Test$1 的一个(未使用的)实例——没有人知道它的存在。然后TestHolder 创建Test$1 的实例并调用 that 构造函数,该构造函数是可访问的(它是默认保护的。)

您可以使用javap -c Test(和javap -c Test\$1,和javap -c Test\$TestHolder)查看代码。其实挺聪明的!

【讨论】:

  • 反编译字节码支持这个答案-static INNERCLASS Test$1 Test null生成。
  • 很好的答案,巧妙的实现。您是否碰巧知道这一点?
  • @Vulcan,不,我没有。认为这是一个有趣的问题,编译了代码,用javap 进行了检查,并解释了我的发现。
  • 不应该是javap -c Test$1javap -c Test$TestHolder 而不是...\$...
  • 嘿。在类 Unix 系统上需要反斜杠,但在 Windows 上不需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多