網頁

2020/11/24

Java 編譯器產生合成class檔的情況 complier create synthetic class $1.class files

Java 1.5及1.6編譯器在下面情況時會額外產生synthetic class檔,也就是類別名稱後接金錢符號(dolor symbol)的class檔(<Class$1.class>)。

  1. 建立匿名類別實例
  2. 列舉(enum)的swtich case
  3. 建立私有內部類別實例

例如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.class
  • Demo$Color.class
  • Demo$Inner.class
  • Demo$1.class(for anonymous class and private inner class instantiation)
  • Demo$2.class(for enum swtich case)

通常那些沒使用CICD上版工具的老舊專案,如果上版時只更新被修改的class檔,這會是很可怕的地雷。


沒有留言:

張貼留言