2012-10-16 44 views
4

我需要给websphere一个补丁。我有一个主要的java类,它有三个内部类。我几乎没有更改主类的代码,但没有更改任何内部类。现在我的问题是,我是否应该将所有内部类与主类文件一起作为补丁或主类的一部分?将java的外部类编译效果内部类

+0

这个问题似乎是无稽之谈。内部类与外部类在同一个文件中。内部类是主类的一部分,就像方法,变量一样。所以你不能在技术上给予主要的_alone_。你给改变的文件,就这些。 – Juvanis

+3

@VincenzoSanchez:是的,你可以。内部类在字节码中并不真正“存在”(即'.class'文件) –

+2

@LukasEder它们是 - 它们是名称中带有美元符号的'.class'文件。 – dasblinkenlight

回答

3

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

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

当我没有做到这一点,有通常是一些晚班加载副作用。在我看来,这通常是因为匿名内部类,它们并不总是重新生成相同的“匿名类索引”(如在$1,$2等中),具体取决于它们在.java文件中的顺序。

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

+0

+1你对匿名类的观点是特别有价值的。 – dasblinkenlight

+0

如果我们没有“匿名内部类”,那么亚当可能是正确的? – VamsiKrishna

+1

@VamsiKrishna:我希望如此,是的。在这种情况下,你只能修补外部类。 –

1

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

+0

如果我们没有“匿名内部类”,那么您的观点是有效的,因为它会生成始终具有相同名称的类文件。 – VamsiKrishna

+0

@VamsiKrishna这是正确的。 Lukas提到,改变匿名内部类的创建顺序可以在FS中产生不同的类名 –