Java 1.5及1.6編譯器在下面情況時會額外產生synthetic class檔,也就是類別名稱後接金錢符號(dolor symbol)的class檔(<Class$1.class>)。
- 建立匿名類別實例
- 列舉(enum)的swtich case
- 建立私有內部類別實例
例如Demo.java內容如下。
Demo.java
public class Demo {
private void run() {
// 1. 建立匿名類別實例 anonymous class instantiation
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
}
});
}
private String getColor(ColorEnum colorEnum) {
// 2. enum switch case
switch (colorEnum) {
case RED: return "red";
case BLUE: return "blue";
default: return "white";
}
}
enum ColorEnum {
RED, BLUE;
}
public Inner getInner() {
// 3. 私有內部類別實例化 private inner class instantiation
return new Inner();
}
private static class Inner {
// Private inner class default constructor is private
}
}
使用javac -source 1.5 -target 1.5 Demo.java編譯後產生的class檔如下:
Demo.classDemo$Color.classDemo$Inner.classDemo$1.class(for anonymous class and private inner class instantiation)Demo$2.class(for enum swtich case)
通常那些沒使用CICD上版工具的老舊專案,如果上版時只更新被修改的class檔,這會是很可怕的地雷。
沒有留言:
張貼留言