我有以下問題:匿名類的二進制名
1)有與存儲在A的靜態字段有兩個匿名子類之間循環依賴幾個匿名子類一些抽象的A級。該抽象類的代碼類似於以下內容:
class A implements Serializable
{
public static final A _1 = new A() {
public A foo()
{
return _2;
}
};
public static final A _2 = new A() {
public A foo()
{
return _1;
}
};
public static final A _3 = new A() {
public void bar()
{
// do something
}
};
}
2)類A的實例被序列化中使用的其他對象引用。有一些對象被開發者預先序列化,然後作爲二進制數據包含在發行版中。
在發佈版本中更改了匿名子類的A類二進制名稱的一些重構之後。我認爲這可能是由於java編譯器版本的差異。從我機器上創建的.class文件中,我可以看到存儲在_1,_2和_3字段中的A的匿名子類分別具有名稱A $ 1,A $ 2和A $ 3,但是從發佈版本獲取的.class文件中,我可以看到存儲在_1,_2和_3字段中的A的匿名子類分別具有名稱A $ 2,A $ 3和A $ 1。由於這個預先序列化的數據變得無法使用,我需要以某種方式解決這個問題。
是否有任何java編譯器或JVM的規範,它會說我應該對我的匿名類有什麼樣的二進制名稱? JLS表示匿名類的名稱應該是封閉類的名稱,「$」 - 不對這些序列設置任何約束的符號和非空序列。
我相信我不應該依賴匿名類的內部名稱,我也知道「正確的」方法來解決這個問題,比如在構建服務器上生成預序列化的數據。太糟糕了,我們現在沒有太多時間來解決這個問題,所以我想知道這個命名差異來自哪裏,所以我現在可以解決這個問題。
在A $ 1類的反序列化過程中,出現「本地類不兼容」異常。發生這種情況是因爲名稱A $ 1的類定義與序列化期間的類定義不同。 – okutane
在這種情況下,[本文] [http://www.informit.com/articles/article.aspx?p=31936]可能會有所幫助。 –
是的,這是編譯器的差異。然而,我還沒有想出它...... – okutane