Java外部类的编译是否会影响内部类?

4

我需要为WebSphere提供一个修补程序。我的主要Java类别有三个内部类。我对主类进行了一些代码更改,但没有更改任何内部类。现在我的问题是,在修补程序中我是应该只提供主类文件还是同时提供所有内部类作为修补程序的一部分?


3
可以。内部类在字节码(即.class文件)中并不存在。 - Lukas Eder
2
@LukasEder 他们有 - 这些是名称中带有美元符号的 .class 文件。 - Sergey Kalinichenko
@dasblinkenlight:是的,我知道。但从正式上讲,它们是完全不同的类。在我看来,“内部类”是Java语言的一个特性。 - Lukas Eder
1
你能不能直接比较一下 .class 文件呢?我不认为它们会改变,但这肯定可以告诉你。 - Duncan Jones
1
@LukasEder 哦,你说得对,我明白你的意思了,并且理解为什么你在“exist”周围加了双引号 :) - Sergey Kalinichenko
显示剩余3条评论
2个回答

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文件中的顺序。
所以,为了确保,因为这种修补技术本来就很粗暴,我总是复制所有的类。

+1 你提到的匿名类是一个特别有价值的观点。 - Sergey Kalinichenko
如果我们没有“匿名内部类”,那么亚当可能是正确的吗? - VamsiKrishna
1
@VamsiKrishna:我认为应该可以,是的。在这种情况下,您只需修补外部类即可。 - Lukas Eder

1

内部类就像普通类一样,具有对外部类的隐式引用,因此我认为如果您确实没有更改内部类,则仅提供外部类是安全的。


如果我们没有“匿名内部类”,那么你的观点是正确的,因为它总是生成具有相同名称的类文件。 - VamsiKrishna
@VamsiKrishna,没错。就像Lukas所说的那样,更改匿名内部类的创建顺序可能会在FS中产生不同的类名。 - Adam Dyga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接