2015-06-22 42 views
6

Dziś natknąłem się na zaciemnioną klasę (dużo zakamuflowanych zajęć w słoiku) i nie mam pojęcia, jak dokonuje się tego rodzaju zaciemnianie.W jaki sposób robi się zaciemnianie w Javie?

Przykład:

protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃) 
    throws Exception 
    { 
    int ☃ = ☃.readableBytes(); 
    if (☃ < this.c) 
    { 
     ☃.b(0); 
     ☃.writeBytes(☃); 
    } 
    else 
    { 
     byte[] ☃ = new byte[☃]; 
     ☃.readBytes(☃); 

     ☃.b(☃.length); 

     this.b.setInput(☃, 0, ☃); 
     this.b.finish(); 
     while (!this.b.finished()) 
     { 
     int ☃ = this.b.deflate(this.a); 
     ☃.writeBytes(this.a, 0, ☃); 
     } 
     this.b.reset(); 
    } 
    } 

} 

Jak widać powyżej, wszystkie zmienne parametryczne są snow-man. Jak można to cofnąć? Również, jak to się dzieje w pierwszej kolejności; W jaki sposób JVM może "przetworzyć" te i wykonać kod bez żadnego problemu?

Aby wyjaśnić, nie zamierzam używać tego kodu, służy on wyłącznie celom edukacyjnym. Biorę kurs informatyki w szkole, ponieważ uczymy się języka Java i mówimy o ograniczeniach, takich jak dekompilacja. Chciałbym dowiedzieć się więcej, więc zdecydowałem się rzucić okiem na większe projekty, zwłaszcza serwery. Ten fragment kodu jest wyciągany z serwera Spigot dla Minecraft (Gra), który jest widelcem serwera Bukkit dla Minecraft, który miał być open source.

+4

To znak Unicode jak każdy inny znak Unicode. Dlaczego miałbyś oczekiwać, że to nie zadziała? – SLaks

+0

Cóż, widzę twój punkt, wiem, że jest i jest "\ u2603" konkretnie, ale nie rozumiem, jak można to zrobić, i cofnąć ...: -) Dzięki. –

+1

To tak jak każda inna nazwa zmiennej. Możesz na przykład nazwać zmienną 'x'.To jest tylko zmienna o nazwie "☃". Nie ma "zrobionego" lub "cofniętego", po prostu można napisać nazwę zmiennej z dowolnymi znakami. –

Odpowiedz

10

Przede wszystkim należy pamiętać, że to parametry mają ten unikod, a nie metody. Dlaczego to jest ważne? Parametry nie muszą mieć określonych nazw, ponieważ są one najczęściej indeksowane przez odniesienie do numeru. Jednak można to określić i zakładam, że większość środowisk wykonawczych java faktycznie nie sprawdza tej nazwy, ponieważ nie jest ona potrzebna do wykonania. W odwrotnej kolejności potrzebne są nazwy klas, nazwy metod i nazwy pól.

O tym, że wspomniałeś o Spigocie, Spigot jest rzeczywiście open source. Najprawdopodobniej jednak dekompilowałeś klasę, która pochodzi z oryginalnego serwera Mojang Minecraft, który nie jest open source i jest rzeczywiście zaciemniony.

Edit: W przypadku, gdy chcesz do zbadania tych klas, Niedawno znalazłem narzędzie o nazwie Bytecode Viewer, która jest dostępna w https://github.com/Konloch/bytecode-viewer To narzędzie ma wiele decompilers jak również niektóre opcje, aby zobaczyć więcej kodu bajtowego jak w wersji z plik klasy. Przykładem funkcji I znaleziono zawiera następujące dane bajtowego:

 <localVar:index=1 , name=☃ , desc=D, sig=null, start=L1, end=L2> 
    <localVar:index=3 , name=☃ , desc=D, sig=null, start=L1, end=L2> 
    <localVar:index=5 , name=☃ , desc=D, sig=null, start=L1, end=L2> 

Rzeczywiście, jak widać, nazwa Unikod jest ustawione tak samo, ale to nie ma znaczenia, ponieważ w końcu indeksy (1,3 , 5) są używane do odniesienia do tych zmiennych.

+0

Rzeczywiście jest z net.minecraft.server, ale w przeszłości zaciemnianie było dużo frendlier: - ( Dostarczony zasób jest WYŁĄCZNIE tym, czego potrzebowałem! Dziękuję bardzo !!! Co też funkcja była taka: jak dotąd mam mały trudny odczyt kodu, ponieważ jest on albo widziany jako wartość Unicode, albo jak pokazano powyżej, ale jest mały: 3 Dzięki: -) –

+1

Oof Ja tego nie zapisałem Myślę, że był to konstruktor klasy zaczynającej się od Biome. Zwróć uwagę, że program ma opcje zmiany wyświetlania/dekompilacji w obszarze Widok, a następnie okienka 1-3. – user254948

+0

Szybko spojrzał. ta konkretna klasa to BiomeBaseSub. Możesz wypróbować Fernflower, aby zobaczyć czytelny kod java i kod bajtowy w drugim okienku. Ma również opcję nie przyjmowania nazw zmiennych z informacji debugowania klasy. – user254948

1
protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃) 

To nie jest ważne. Nie możesz mieć wielu parametrów o tej samej nazwie. Możliwe, że nie czytasz tekstu w Unicode z odpowiednim formatem tekstu.

+1

Naprawdę nie można go skompilować. Jednak jest dozwolone w bajtode. – user254948

+0

Dobra rada i dobra odpowiedź @ user254948 –

0

Twój edytor tekstu pokazuje wartość znaku Unicode.

Właśnie przetestowałem na zaćmieniu i nazwy ze znakami Unicode są dopuszczalne.

public String publicationXmlUrl(int \u9090currentPage) { 

Ale pisanie o wartościach nie są:

public String publicationXmlUrl(int ♥currentPage) {