/ / Dekomplikowane klasy Java mają pewne specjalne cechy - Java, dekompilacja

Dekomplowane klasy java mają pewne specjalne znaki - java, dekompilację

Dekompilowałem niektóre klasy Java i otrzymuję źródło ze znakami specjalnymi:

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

co to znaczy: this.val$b?

Odpowiedzi:

7 dla odpowiedzi № 1

Zgodnie ze specyfikacją Java (patrz http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html#3.8) $ jest prawidłową wartością w identyfikatorze. Pamiętaj jednak, że „Znak $ powinien być używany tylko w mechanicznie generowanym kodzie źródłowym lub, rzadko, w celu uzyskania dostępu do wcześniej istniejących nazw w starszych systemach.”

Istnieją dwa typowe powody, dla których znaki dolara w nazwie zmiennej w zdekompilowanym kodzie:

1. Twój kod źródłowy zawiera wewnętrzną klasę (być może, ale niekoniecznie anonimowy), w którym to przypadku rzeczy dla klasy wewnętrznej będą miały zmienne i nazwy konstruktorów, takie jak outerclass$innerclass. (Zobacz na przykład http://docstore.mik.ua/orelly/java/exp/ch05_09.htm w rozdziale o tym, jak naprawdę działają klasy wewnętrzne). Jeśli klasa jest anonimowa, nazwy będą miały schemat / formę nazewnictwa, taką jak zewnętrzna klasa $, po której nastąpi klasa zewnętrzna 1 i tak dalej

2. Kod został uruchomiony przez obfuscator. Obfuscator spełnia kryterium „mechanicznego generowania” kodu źródłowego, dzięki czemu może używać znaków dolara w grze. Przykładem może być RetroGuard, co wyjaśnia w FAQ na swojej stronie internetowej, kryterium użycia $ w zmiennej i klasienazwy. Zasadniczo, obfuscator używa $ jako elementu ujednoznaczniającego i zmieni nazwy klas lub zmiennych z wygenerowanymi nazwami (zazwyczaj litery o pojedynczym znaku używane, gdy jest to możliwe, aby zminimalizować rozmiar kodu), a to, co zostanie zmienione, a co nie, zależy od zakresu zmiennej, itp.

W twoim konkretnym przykładzie val $ b wydaje mi się, że może to być zmienna nazwa, która została zaciemniona.


1 dla odpowiedzi nr 2

Zgodnie z http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html znak dolara w nazwie zmiennej jest prawidłowy, ale nie jest zalecany, wspominają, że może go użyć kod wygenerowany automatycznie

poniżej jest skopiowany z linku, ja pogrubiony części do podkreślenia

W nazwach zmiennych rozróżniana jest wielkość liter. Nazwą zmiennej może być dowolny prawny identyfikator - nieograniczona długość sekwencji liter i cyfr Unicode, zaczynających się na literę, znak dolara „$”, lub znak podkreślenia „Konwencja polega jednak na tym, że nazwy zmiennych zawsze zaczynają się od litery, a nie „$” lub „". Ponadto znak dolara, zgodnie z konwencją, nigdy nie jest w ogóle używany. Możesz znaleźć sytuacje, w których automatycznie wygenerowane nazwy będą zawierały znak dolara, ale zawsze należy unikać nazw zmiennychUżyj tego. Podobna konwencja istnieje dla znaku podkreślenia; chociaż technicznie legalne jest rozpoczynanie nazwy zmiennej od „_”, praktyka ta jest odradzana. Białe spacje nie są dozwolone. Kolejnymi znakami mogą być litery, cyfry, znaki dolara lub znaki podkreślenia. Konwencje (i zdrowy rozsądek) mają również zastosowanie do tej zasady. Wybierając nazwę swoich zmiennych, używaj pełnych słów zamiast tajemniczych skrótów. Dzięki temu kod będzie łatwiejszy do odczytania i zrozumienia. W wielu przypadkach spowoduje to również, że kod sam się dokumentuje; na przykład pola o kadencji, prędkości i biegu są o wiele bardziej intuicyjne niż wersje skrócone, takie jak s, c i g. Pamiętaj również, że wybrana nazwa nie może być słowem kluczowym ani słowem zastrzeżonym


0 dla odpowiedzi № 3

(Eh, chyba to jest odpowiedź)

$ nie ma specjalnego znaczenia w Javie, to po prostu wymyślił dekompilator dla nazwy zmiennej.


0 dla odpowiedzi nr 4

„$” Jest poprawnym znakiem w identyfikatorach Java. Więc „val $ b” to tylko nazwa pola. Widzieć http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8


0 dla odpowiedzi № 5

Prawidłowe identyfikatory Java mogą zawierać listy(a-z,A-Z), cyfry (0-9), podkreślenia (_) i dolara ($). Więc nazwy identyfikacyjne, które widzisz, są po prostu prawidłowymi nazwami bez specjalnego znaczenia.