繁体   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