簡體   English   中英

反編譯的java類有一些特殊的字符

[英]Decompiled java classes have some special characters

我反編譯了一些java類,我得到一個特殊字符的源:

this.val$b.dispose();
this.val$domainLabel.setText((String)domains_config.get("description"));

這是什么意思: this.val$b

根據Java規范(請參閱http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html#3.8),$是標識符中的有效值。 但請注意, “$字符應僅用於機械生成的源代碼,或者很少用於訪問舊系統上的預先存在的名稱。”

在反編譯代碼中看到變量名中的美元符號有兩個常見原因:

1.您的源代碼包含一個內部類 (可能,但不一定是匿名的),在這種情況下,內部類的內容將具有變量和構造函數名稱,如outerclass$innerclass (參見http://docstore.mik.ua/orelly/java/exp/ch05_09.htm中有關內部類如何工作的部分)。 如果該類是匿名的,則名稱將具有命名方案/表單,如outerclass $,后跟外部類$ 1,依此類推

2.代碼已通過混淆器運行。 混淆器符合“機械生成”源代碼的標准,因此它可以在ame中使用美元符號。 一個例子是RetroGuard,它在他們網站FAQ中解釋了在變量和類名中使用$的標准。 從本質上講,混淆器使用$作為消歧器,並使用生成的名稱重命名類或變量(通常在可能的情況下使用單個字符字母以最小化代碼大小),重命名的內容和不重命名的內容取決於變量的范圍等。

在您的特定示例中,val $ b看起來像是可能是已被混淆的變量名稱。

根據http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html變量名中的美元符號是有效的,但不推薦,他們提到自動生成的代碼可能會使用它

下面是從鏈接中復制的,我用粗體部分來強調

變量名稱區分大小寫。 變量的名稱可以是任何合法的標識符 - Unicode字母和數字的無限長度序列,以字母開頭, 美元符號“$”或下划線字符“ ”。 但是,慣例是始終使用字母開頭,而不是“$”或“ ”。 此外,按照慣例,美元符號字符根本不會被使用。 您可能會發現某些情況,其中自動生成的名稱將包含美元符號 ,但您的變量名稱應始終避免使用它。 對於下划線字符存在類似的約定; 雖然用“_”開始變量的名稱在技術上是合法的,但不鼓勵這種做法。 不允許有空白區域。 后續字符可以是字母,數字,美元符號或下划線字符。 約定(和常識)也適用於此規則。 為變量選擇名稱時,請使用完整單詞而不是隱藏縮寫。 這樣做可以使您的代碼更易於閱讀和理解。 在許多情況下,它還會使您的代碼自我記錄; 例如,名為cadence,speed和gear的字段比縮寫版本(如s,c和g)更直觀。 另請注意,您選擇的名稱不得是關鍵字或保留字

(呃,我猜它實際上是答案)

$在Java中沒有特殊含義,這就是反編譯器為變量名稱提出的內容。

'$'是java標識符中的有效字符。 所以“val $ b”只是該領域的名稱。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8

有效的java標識符可以包含字母( a - zA - Z ),數字( 0 - 9 ),下划線( _ )和美元( $ )。 所以你看到的id名稱只是一個沒有任何特殊含義的有效名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM