在Java中,與Sun的JDK 1.6,用枚舉像這樣:如何將編譯後的類名與Java中的枚舉成員匹配?
public enum MyEnum {
FIRST_MEMBER { public void foo() { } },
SECOND_MEMBER { public void foo() { } },
THIRD_MEMBER { public void foo() { } };
}
編譯後的文件是:
MyEnum$1.class MyEnum$2.class MyEnum$3.class MyEnum.class
這也意味着,堆棧跟蹤顯示foo()
,或方法調用在JVisualVM等印刷,都會有這樣的事情在頂部:
mypackage.MyEnum$1.run()
的$1
在類名我這是由於枚舉的成員被編譯爲匿名內部類。我想知道是否可以安全地假設這些類名中使用的數字映射到定義枚舉成員的順序?如果不是,是否有一種標準的,有保證的方式來從用作匿名類名的號碼中找到枚舉成員?
EDIT
在問候枚舉的設計,這是僅用於說明的目的。真正的枚舉實現了一個接口,每個成員都提供了不同的方法實現。請不要太在意那些看起來有點奇怪的事情。
編輯#2
爲了澄清,我不是試圖用這些信息編程(如怪異反射廢話)做任何事情。相反,我正在查看堆棧跟蹤和分析信息,並嘗試將枚舉成員(顯示爲匿名類的調用)上的方法調用映射到源代碼中的實際枚舉成員。
請參閱編輯#2。 – Grundlefleck 2010-10-22 16:35:24
@Grundlefleck,我的猜測是你可以在堆棧跟蹤(在給定的執行運行中)的序號和類名之間進行映射。但是,如果你的枚舉做得太多以至於你需要在剖析器中分析它們的方法調用,那麼你可能會重構將枚舉方法中較重的東西移動到其他適當的命名類中。 – 2010-10-22 16:48:40