我反编译了一些java类,我得到了一个带有特殊字符的源:
this.val$b.dispose();
this.val$domainLabel.setText((String)domains_config.get("description"));
这是什么意思:this.val$b
?
答案 0 :(得分:7)
根据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 on their website中解释了在变量和类名中使用$的标准。从本质上讲,混淆器使用$作为消歧器,并使用生成的名称重命名类或变量(通常在可能的情况下使用单个字符字母以最小化代码大小),重命名的内容和不重命名的内容取决于变量的范围等。
在您的特定示例中,val $ b看起来像是可能是已被混淆的变量名称。
答案 1 :(得分:1)
根据http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html变量名中的美元符号是有效的,但不推荐,他们提到自动生成的代码可能会使用它
下面的是从链接复制的,粗体部分用于强调
变量名称区分大小写。变量的名称可以是任何合法的标识符 - Unicode字母和数字的无限长度序列,以字母开头,美元符号“$”,或下划线字符“”。但是,惯例是始终使用字母开头,而不是“$”或“”。 此外,按照惯例,美元符号字符根本不会被使用。您可能会发现某些情况,其中自动生成的名称将包含美元符号,但您的变量名称应始终避免使用它。对于下划线字符存在类似的约定;虽然用“_”开始变量的名称在技术上是合法的,但不鼓励这种做法。不允许有空白区域。 后续字符可以是字母,数字,美元符号或下划线字符。约定(和常识)也适用于此规则。为变量选择名称时,请使用完整单词而不是隐藏缩写。这样做可以使您的代码更易于阅读和理解。在许多情况下,它还会使您的代码自我记录;例如,名为cadence,speed和gear的字段比缩写版本(如s,c和g)更直观。另请注意,您选择的名称不能是关键字或保留字
答案 2 :(得分:0)
(呃,我猜它实际上就是答案)
$
在Java中没有特殊含义,这只是反编译器为变量名称提出的内容。
答案 3 :(得分:0)
'$'是java标识符中的有效字符。所以“val $ b”只是该领域的名称。见http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8
答案 4 :(得分:0)
有效的java标识符可以是contain个字母(a
- z
,A
- Z
),数字(0
- {{ 1}}),下划线(9
)和美元(_
)。所以你看到的id名称只是一个没有任何特殊含义的有效名称。