2012-06-07 63 views
0

我正在使用GWT。GWT類成員命名

當它將Java代碼編譯爲Javascript代碼時,它有時會更改一些成員的名稱。例如: : private int height; 成爲JS: height_0;

實施例:

public class TestClass {

private int a; 

public TestClass() 
{ 
    a = 0; 
} 

public TestClass(int a) 
{ 
    this.a = a; 
} 

public int getMember() 
{ 
    return a; 
} 

public void advance() 
{ 
    a++; 
} 

}
會導致輸出像這樣:

function TestClass_0(){ 

this.a_0 = 0; 

} 



function TestClass_1(a){ 

this.a_0 = a; 

} 



function TestClass(){ 

} 



_ = TestClass_1.prototype = TestClass_0.prototype = TestClass.prototype = new Object_0; 

_.advance_0 = function advance(){ 

++this.a_0; 

} 

; 

_.getClass$ = function getClass_1(){ 

return Lcom_autodesk_autocadws_gwt_platform_testExporter_TestClass_2_classLit; 

} 

; 

_.getMember_0 = function getMember(){ 

return this.a_0; 

} 

; 

_.a_0 = 0; 

} 

的構件的名稱變更爲A_0。在某些情況下,當使用網絡工作者時,代碼將在網絡工作者腳本上以不同方式編譯,並且成員的名稱不會被更改(例如,將被修改爲a_1)。 我的問題是,當我將消息中的對象傳輸給Web工作人員時。當用Java編碼web worker時,我期望訪問成員a,而不是a_0。使用getters並不能解決這個問題,因爲當編譯成JS時,它們被直接訪問所取代。我的問題: 爲什麼會發生這些命名變化?在哪些情況下?是否有可能避免它們?

非常感謝。

+0

如果一切都通過GWT,命名應該是一致的,你應該沒問題。 –

+0

它們在主線程上下文和web worker上下文之間不一致,因爲這兩個上下文被編譯爲2個獨立的腳本。 – user1442141

+0

我認爲,當成員名字與全局空間的變量或Javascript結構的成員相沖突時,它們將被重命名。在我的情況下,寬度或高度等名稱出現問題(當然,這些名稱在OBF模式下已更改,因此可解決此問題)。任何人都可以在這個問題上確認我? – user1442141

回答

1

在大多數情況下,這些字段實際上將重命名爲LIK ab,等你看到的是這裏由於與-style PRETTY不混淆代碼進行編譯。

GWT混淆代碼的原因是爲了使它更小。

如果需要將對象傳遞給外界,你必須連載他們(或它們映射到JavaScript對象),以穩定的結構。

最簡單的方法是使用JavaScriptObject。你也可以看看gwt-exporter

+0

謝謝托馬斯的快速反應。 – user1442141

+0

不幸的是,OBF模式目前不是一種選擇,因爲我們處於開發階段,需要漂亮模式才能進行調試。擴展JavaScriptObject也有問題,由於它的限制(我們的類型非常複雜)。 關於gwt-exporter - 我的問題是我需要傳遞包含複雜類型成員等的類型。這意味着我需要導出幾乎整個系統。 我想我正在試圖找出是什麼導致這些名稱的變化,所以我可以儘量避免它們。它們是由於腳本全局中的名稱衝突而創建的嗎? – user1442141

+0

我對重命名沒有問題,我只是希望它在主線程上下文和web worker上下文之間保持一致。它們被編譯成3個不同的腳本。 – user1442141

相關問題