4

我反编译了一些 java 类,得到了一个带有特殊字符的源代码:

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

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

4

5 回答 5

8

根据 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$ 后跟 outerclass$1 等等

2. 代码已通过混淆器运行。混淆器符合“机械生成”源代码的标准,因此它可以在 ame 中使用美元符号。一个例子是 RetroGuard,它在他们网站上的常见问题解答中解释了在变量和类名中使用 $ 的标准。本质上,混淆器使用 $ 作为消歧器,并将使用生成的名称重命名类或变量(通常在可能的情况下使用单字符字母以最小化代码大小),重命名的内容和不重命名的内容取决于变量的范围等。

在您的特定示例中, val$b 在我看来它可能是一个已被混淆的变量名。

于 2012-05-10T21:09:19.070 回答
1

根据http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html变量名中的美元符号是有效的,但不推荐,他们提到自动生成的代码可能会使用它

下面是从链接复制的,我加粗部分强调

变量名区分大小写。变量的名称可以是任何合法标识符——无限长度的 Unicode 字母和数字序列,以字母、美元符号“$”或下划线字符“ ”开头。然而,惯例是始终以字母开头变量名,而不是“$”或“ ”。此外,按照惯例,从不使用美元符号字符。您可能会发现自动生成的名称将包含美元符号的某些情况,但您的变量名应始终避免使用它。下划线字符也有类似的约定;虽然以“_”开头的变量名称在技术上是合法的,但不鼓励这种做法。不允许使用空格。后续字符可以是字母、数字、美元符号或下划线字符。惯例(和常识)也适用于该规则。为变量选择名称时,请使用完整的单词而不是隐晦的缩写。这样做将使您的代码更易于阅读和理解。在许多情况下,它还会使您的代码自我记录;例如,名为 cadence、speed 和 gear 的字段比 s、c 和 g 等缩写版本更直观。另外请记住,您选择的名称不能是关键字或保留字

于 2012-05-10T14:55:03.653 回答
0

(嗯,我想这实际上是答案)

$在 Java 中没有特殊含义,这只是反编译器为变量名提出的。

于 2012-05-10T14:52:35.653 回答
0

'$' 是 java 标识符中的有效字符。所以“val$b”只是字段的名称。请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8

于 2012-05-10T14:52:42.343 回答
0

有效的 java 标识符可以包含字母(a- zA- Z)、数字(0- 9)、下划线(_)和美元($)。因此,您看到的 id 名称只是一个有效名称,没有任何特殊含义。

于 2012-05-10T14:53:49.350 回答