/ / Les classes java non conformes ont des caractères spéciaux - java, décompilation

Les classes java non conformes ont des caractères spéciaux - java, décompilation

J'ai décompilé des classes java et j'obtiens une source avec des caractères spéciaux:

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

Qu'est-ce que ça veut dire: this.val$b?

Réponses:

7 pour la réponse № 1

Selon les spécifications Java (voir http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html#3.8) $ est une valeur valide dans un identifiant. Cependant, notez que "Le caractère $ ne doit être utilisé que dans le code source généré mécaniquement ou, rarement, pour accéder à des noms préexistants sur des systèmes hérités."

Il existe deux raisons courantes de voir des signes dollar dans un nom de variable en code décompilé:

1. Votre code source contient une classe interne (peut-être, mais pas nécessairement anonyme), auquel cas les choses pour la classe interne auront des noms de variable et de constructeur comme outerclass$innerclass. (Voir par exemple http://docstore.mik.ua/orelly/java/exp/ch05_09.htm dans la section sur le fonctionnement réel des classes internes). Si la classe est anonyme, les noms auront un schéma / une forme de nommage tel que outerclass $ suivi de outerclass $ 1, etc.

2. Le code a été exécuté via un obfuscateur. Un obfuscateur répond au critère de "génération mécanique" du code source, de sorte qu'il peut utiliser des signes en dollars de près. Un exemple serait RetroGuard, qui explique dans une FAQ sur leur site web, le critère d'utilisation de $ dans la variable et la classedes noms. L’obfuscateur utilise essentiellement le $ comme un homonymie et renommera les classes ou les variables avec les noms générés (généralement des lettres à caractère unique utilisées lorsque cela est possible pour réduire la taille du code), ainsi que ce qui est renommé et ce qui ne dépend pas de la portée de la variable, etc.

Dans votre exemple particulier, val $ b me donne l’impression que cela pourrait être un nom de variable qui a été obscurci.


1 pour la réponse № 2

Accordé à http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html un signe dollar dans un nom de variable est valide, mais non recommandé, ils mentionnent que le code généré automatiquement pourrait l'utiliser

ci-dessous est copié du lien, je audacieux pièces pour emphase

Les noms de variables sont sensibles à la casse. Le nom d’une variable peut être n’importe quel identifiant légal - une séquence illimitée de lettres et de chiffres Unicode, commençant par une lettre, le signe dollar "$", ou le caractère de soulignement "". La convention, cependant, est de toujours commencer vos noms de variables avec une lettre, pas" $ "ou"". De plus, le caractère de signe dollar, par convention, n’est jamais utilisé. Vous pouvez rencontrer des situations où les noms générés automatiquement contiennent le signe dollar., mais vos noms de variables doivent toujours éviterEn l'utilisant. Une convention similaire existe pour le caractère de soulignement; bien qu’il soit techniquement légal de commencer le nom de votre variable par "_", cette pratique est déconseillée. Les espaces blancs ne sont pas autorisés. Les caractères suivants peuvent être des lettres, des chiffres, des signes dollar ou des caractères de soulignement. Les conventions (et le sens commun) s'appliquent également à cette règle. Lorsque vous choisissez un nom pour vos variables, utilisez des mots entiers plutôt que des abréviations cryptiques. Cela rendra votre code plus facile à lire et à comprendre. Dans de nombreux cas, votre code s'auto-documentera également; Les champs nommés cadence, vitesse et vitesse, par exemple, sont beaucoup plus intuitifs que les versions abrégées, telles que s, c et g. Notez également que le nom que vous choisissez ne doit pas être un mot clé ou un mot réservé.


0 pour la réponse № 3

(Eh, je suppose que c’est en fait la réponse)

$ n’a aucune signification particulière en Java, c’est simplement ce que le décompilateur a proposé pour le nom de la variable


0 pour la réponse № 4

Le "$" est un caractère valide dans les identifiants java. Donc "val $ b" est juste le nom du champ. Voir http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8


0 pour la réponse № 5

Les identifiants Java valides peuvent contenir des lettres(a-z,A-Z), chiffres (0-9), soulignés (_) et le dollar ($). Les identifiants que vous voyez ne sont donc qu’un nom valide, sans signification particulière.