Java Decompiler je posebna vrsta decompilerja, ki sprejme datoteko razreda kot vhod in ustvari izvorno kodo Java kot izhod. Dekompilacija je ravno obraten postopek kot kompilacija. Tako dekompilator ne izdela replike izvorne kode. To je zato, ker se med prevajanjem programa iz izvorne kode izgubi nekaj informacij.
Obstaja pa veliko zapletenosti, na primer koda Java je strukturirana, bajtna koda pa ni strukturirana. Poleg tega transformacija ni ena proti ena: dva različna programa Java lahko ustvarita enako bajtno kodo.
Na voljo so naslednji dekompilatorji Java:
- DJ Java Decompiler
- JReversePro
- ŽIDJE
- JD-CORE/ JD-GUI/ JD Eclipse
JAD Decompiler
JAD je aplikacija ukazne vrstice. Napisan je v C++. Glavna funkcija je razstaviti datoteke .class. JAD je mogoče namestiti s konzole in bo razrede Java dekompiliral v izvorno kodo. Na ta način lahko razvijalci pogledajo globoko v kodo izvajalnih knjižnic Java in celo polepšajo vrstice ter jih pripravijo na ponovno prevajanje. Obstaja nevarnost prepisovanja datotek izvorne kode, zlasti če je uporabljen parameter '-o' (prepisovanje izhodnih datotek brez potrditve).
Primer
Ustvarimo preprost program Java, ki sešteje dve številki.
import java.util.*; class DecompilerDemo { public static void main(String args[]) { int a,b,c; Scanner sc=new Scanner(System.in); System.out.print('Enter the value of a: '); a=sc.nextInt(); System.out.print('Enter the value of b: '); b=sc.nextInt(); c=a+b; System.out.println('sum of a and b is: '+c); } }
Sledite korakom za pretvorbo .class v berljivo izvorno kodo Java. Tukaj uporabljamo JAD decompiler.
Korak 1: Prenesite orodje JAD iz https://bit.ly/2XuRzT5
2. korak: Ekstrahirajte datoteko zip in dobite jad.exe.
3. korak: Ustvarite datoteko .java (DecompilerDemo.java) v isti mapi, v kateri ste ekstrahirali datoteko zip.
4. korak: Prevedite in zaženite datoteko .java. Ustvaril bo datoteko .class v ustrezni mapi.
5. korak: Zdaj premaknite datoteko .class in aplikacijo jad v drugo mapo.
6. korak: Vnesite ukaz: jad DecompilerDemo
Zgornji ukaz ustvari datoteko .jad v ustrezni mapi.
java znak v niz
7. korak: Vnesite ukaz: jad?s java DecompilerDemo
brezplačen ipconfig
Ustvari datoteko .java v isti mapi.
Odprite DecompilerDemo.java in dobimo naslednjo kodo:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: DecompilerDemo.java import java.io.PrintStream; import java.util.Scanner; class DecompilerDemo { DecompilerDemo() { } public static void main(String args[]) { Scanner scanner = new Scanner(System.in); System.out.print('Enter the value of a: '); int i = scanner.nextInt(); System.out.print('Enter the value of b: '); int j = scanner.nextInt(); int k = i + j; System.out.println((new StringBuilder()).append('sum of a and b is: ').append(k).toString()); } }
Opazimo lahko, da se zapisana datoteka .java razlikuje od ustvarjene datoteke .java, vendar daje enak rezultat.
Java Class File Disassembler
ukaz javap
The javap je orodje ukazne vrstice Java, ki je priloženo JDK. Uporablja se za razstavljanje datoteke razreda in tiskanje človeku berljive različice tega razreda. Njegov rezultat je odvisen od uporabljene možnosti. Ne da bi uporabil katero koli možnost, javap natisne paket, zaščitena in javna polja ter metode razredov, ki so mu bili posredovani. A javap se uporablja tudi za ugotavljanje, katere metode so na voljo za razred, če nimate izvorne kode, ki je bila uporabljena za ustvarjanje razreda. Splošna oblika ukaza javap je:
javap [options] filename
Opcije
Z ukazom javap je na voljo veliko možnosti. Nekateri izmed njih so:
Razstavite datoteko razreda z ukazom javap
class DisassembleDemo { public static void main(String args[]) { System.out.println('Java'); } }
Ustvarite datoteko razreda zgornjega programa in uporabite naslednji ukaz za razstavljanje datoteke razreda.
javap -c -p DisassembleDemo
Izhod
Naslednji izhod prikazuje, kaj vsebuje datoteka razreda.
Vendar izvorne kode Jave ne dobimo z uporabo ukaza javap. Tako je na voljo veliko dekompilatorjev, ki pretvorijo datoteko .class v datoteko .java.