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を参照) によると、$ は識別子の有効な値です。ただし、「$ 文字は、機械的に生成されたソース コードでのみ使用するか、まれに、レガシー システムの既存の名前にアクセスするために使用する必要があります」ことに注意してください。

逆コンパイルされたコードの変数名にドル記号が表示される一般的な理由は 2 つあります。

1.ソースコードに内部クラスが含まれています(おそらく匿名クラスである必要はありません)outerclass$innerclass。(たとえば、内部クラスが実際にどのように機能するかに関するセクションのhttp://docstore.mik.ua/orelly/java/exp/ch05_09.htmを参照してください)。クラスが匿名の場合、名前には、outerclass$ の後に outerclass$1 が続くような命名スキーム/形式があります。

2. コードは難読化ツールを介して実行されています。難読化ツールは、ソース コードを「機械的に生成する」という基準を満たしているため、名前にドル記号を使用できます。例として、RetroGuard は、Web サイトの FAQ で、変数名とクラス名に $ を使用する基準について説明しています。基本的に、難読化ツールは $ を曖昧さをなくすために使用し、クラスまたは変数の名前を生成された名前 (コード サイズを最小限に抑えるために可能な場合は通常 1 文字) に変更します。名前が変更されるものと変更されないものは、変数のスコープなどによって異なります。

あなたの特定の例では、 val$b は、難読化された変数名のように見えます。

于 2012-05-10T21:09:19.070 に答える
1

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.htmlによると、変数名のドル記号は有効ですが、推奨されません。自動生成コードがそれを使用する可能性があると述べています

以下はリンクからのコピーです。強調するために太字の部分を太字にしています

変数名は大文字と小文字が区別されます。変数の名前は、任意の正当な識別子 (文字、ドル記号 "$"、またはアンダースコア文字 " "で始まる、長さに制限のない Unicode 文字と数字のシーケンス) にすることができます。ただし、慣習として、変数名は常に "$" や " " ではなく文字で始めますさらに、慣例により、ドル記号文字はまったく使用されません。自動生成された名前にドル記号が含まれる場合があります、ただし、変数名では常に使用を避ける必要があります。アンダースコア文字にも同様の規則があります。変数の名前を「_」で始めることは技術的には合法ですが、この方法はお勧めできません。空白は使用できません。後続の文字は、文字、数字、ドル記号、またはアンダースコア文字です。規則 (および常識) は、このルールにも適用されます。変数の名前を選択するときは、わかりにくい略語ではなく、完全な単語を使用してください。そうすることで、コードが読みやすく理解しやすくなります。多くの場合、コードを自己文書化することにもなります。たとえば、ケイデンス、スピード、ギアという名前のフィールドは、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 識別子には、文字 ( - 、- )、数字 ( - )、アンダースコア ( )、およびドル ( ) を含めることができます。したがって、表示される ID 名は、特別な意味を持たない単なる有効な名前です。azAZ09_$

于 2012-05-10T14:53:49.350 に答える