/ / Dekomplizierte Java-Klassen haben einige spezielle Merkmale - Java, dekompilieren

Dekomplizierte Java-Klassen haben einige spezielle Zeichen - Java, Dekompilieren

Ich habe einige Java-Klassen dekompiliert und bekomme eine Quelle mit Sonderzeichen:

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

was bedeutet das: this.val$b?

Antworten:

7 für die Antwort № 1

Nach der Java - Spezifikation (siehe http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html#3.8) $ ist ein gültiger Wert in einem Bezeichner. Beachten Sie jedoch, dass "Das $ -Zeichen sollte nur in maschinell erzeugtem Quellcode verwendet werden oder selten, um auf vorhandene Namen in älteren Systemen zuzugreifen."

Es gibt zwei häufige Gründe, warum Dollarzeichen in einem Variablennamen in dekompiliertem Code angezeigt werden:

1. Ihr Quellcode enthält eine innere Klasse (vielleicht, aber nicht unbedingt anonym). In diesem Fall haben die Dinge für die innere Klasse Variablen- und Konstruktornamen wie outerclass$innerclass. (Siehe zum Beispiel http://docstore.mik.ua/orelly/java/exp/ch05_09.htm im Abschnitt darüber, wie innere Klassen wirklich funktionieren). Wenn die Klasse anonym ist, haben die Namen ein Namensschema / eine Namensform wie äußere Klasse $, gefolgt von äußerer Klasse $ 1 und so weiter

2. Der Code wurde durch einen Obfuscator ausgeführt. Ein Obfuscator erfüllt das Kriterium, den Quellcode "mechanisch zu generieren", damit er Dollarzeichen in der Ame verwenden kann. Ein Beispiel wäre RetroGuard, was in einem erklärt wird FAQ auf ihrer Website, das Kriterium für die Verwendung von $ in Variable und KlasseNamen. Im Wesentlichen verwendet der Obfuscator das $ als Disambiguator und benennt Klassen oder Variablen mit generierten Namen um (in der Regel werden einzelne Buchstaben verwendet, wenn dies möglich ist, um die Codegröße zu minimieren) und was umbenannt wird und was nicht vom Gültigkeitsbereich der Variablen abhängt. usw.

In Ihrem speziellen Beispiel scheint mir val $ b ein verschleierter Variablenname zu sein.


1 für die Antwort № 2

Nach http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html Ein Dollarzeichen in einem Variablennamen ist gültig, wird jedoch nicht empfohlen. Sie erwähnen, dass automatisch generierter Code dies möglicherweise verwendet

unten wird aus dem link kopiert, ich fett gedruckt Teile zur Hervorhebung

Variablennamen unterscheiden zwischen Groß- und Kleinschreibung. Der Name einer Variablen kann ein beliebiger zulässiger Bezeichner sein - eine unbegrenzte Folge von Unicode-Buchstaben und -Ziffern, beginnend mit einem Buchstaben. das Dollarzeichen "$", oder der Unterstrich "". Die Konvention ist jedoch, Ihre Variablennamen immer mit einem Buchstaben zu beginnen, nicht mit" $ "oder"". Darüber hinaus wird das Dollarzeichen gemäß Konvention überhaupt nicht verwendet. Es kann vorkommen, dass automatisch generierte Namen das Dollarzeichen enthalten, aber Ihre Variablennamen sollten immer vermeidenes benutzen. Eine ähnliche Konvention besteht für den Unterstrich; Obwohl es technisch gesehen legal ist, den Namen Ihrer Variablen mit "_" zu beginnen, wird von dieser Vorgehensweise abgeraten. Leerzeichen sind nicht zulässig. Nachfolgende Zeichen können Buchstaben, Ziffern, Dollarzeichen oder Unterstriche sein. Konventionen (und gesunder Menschenverstand) gelten auch für diese Regel. Verwenden Sie bei der Auswahl eines Namens für Ihre Variablen vollständige Wörter anstelle von kryptischen Abkürzungen. Dadurch wird der Code leichter lesbar und verständlicher. In vielen Fällen wird Ihr Code dadurch auch selbstdokumentierend. Die Felder Trittfrequenz, Geschwindigkeit und Gang sind beispielsweise viel intuitiver als abgekürzte Versionen wie s, c und g. Denken Sie auch daran, dass der von Ihnen gewählte Name kein Schlüsselwort oder reserviertes Wort sein darf


0 für die Antwort № 3

(Eh, ich denke, es ist eigentlich die Antwort)

$ hat in Java keine besondere Bedeutung, das hat sich der Dekompiler für den Variablennamen einfallen lassen.


0 für die Antwort № 4

Das "$" ist ein gültiges Zeichen in Java-Bezeichnern. "Val $ b" ist also nur der Name des Feldes. Sehen http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8


0 für die Antwort № 5

Die gültigen Java-IDs können enthalten Briefe(a-z,A-Z), Ziffern (0-9), Unterstriche (_) und der Dollar ($). Die angezeigten ID-Namen sind also nur gültige Namen ohne besondere Bedeutung.