【问题标题】:will java outer class compilation effects inner classjava外部类编译会影响内部类吗
【发布时间】:2012-10-06 14:47:56
【问题描述】:

我需要给 websphere 打一个补丁。我有一个主要的 java 类,它有三个内部类。我对主类的代码更改很少,但对任何内部类都没有更改。现在我的问题是我是否需要将所有内部类以及主类文件作为补丁的一部分或仅作为主类的一部分就足够了?

【问题讨论】:

  • 这个问题似乎是无稽之谈。内部类与外部类在同一个文件中。内部类是主类的一部分,就像方法、变量一样。所以你不能在技术上给主课单独。您提供更改后的文件,仅此而已。
  • @VincenzoSanchez:是的,你可以。内部类在字节码中并不真正“存在”(即.class 文件)
  • @LukasEder 确实如此 - 这些是名称中带有美元符号的 .class 文件。
  • 你不能只区分 .class 文件吗?我不认为他们会改变,但这肯定会告诉你。
  • @LukasEder 啊,你说得对,我明白你的意思,明白你为什么在“存在”周围加上双引号:)

标签: java class inner-classes


【解决方案1】:

这不是一个权威的答案,但是每次我做这样的补丁时,我都会复制所有的类(外部内部类),即

Outer.class
Outer$1.class     // These indexes might change ...
Outer$2.class     // ... between compilation runs
Outer$Inner.class // This name should never change

当我不这样做时,通常会有一些延迟类加载的副作用。在我看来,这最常发生的原因是 anonymous 内部类,它们并不总是重新生成相同的“匿名类索引”(如 $1$2 等),具体取决于他们在.java 文件中的订单。

所以,可以肯定的是,因为这种修补无论如何都是一种流氓技术,所以我总是复制所有的类。

【讨论】:

  • +1 您关于匿名课程的观点特别有价值。
  • 如果我们没有“匿名内部类”,那么 Adam 可能是正确的?
  • @VamsiKrishna:我希望如此,是的。在这种情况下,您可以只修补外部类。
【解决方案2】:

内部类就像普通类一样隐式引用外部类,所以我会说只给外部类是安全的如果你真的没有改变内部类。

【讨论】:

  • 如果我们没有“匿名内部类”,那么您的观点是有效的,因为它生成的类文件总是具有相同的名称。
  • @VamsiKrishna 是正确的。正如 Lukas 所说,改变匿名内部类的创建顺序可以在 FS 中产生不同的类名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多