En Java Decompiler är en speciell typ av decompiler som tar en klassfil som indata och producerar Java-källkod som output. Dekompileringen är exakt den omvända processen för kompilering. Dekompilatorn producerar alltså inte en kopia av källkoden. Det beror på att lite information förloras från källkoden under kompileringen av programmet.
Men det finns många komplexiteter, till exempel är Java-kod strukturerad och bytekod är inte strukturerad. Dessutom är transformationen inte en till en: två olika Java-program kan ge identisk bytekod.
Det finns följande Java-dekompilatorer tillgängliga:
- DJ Java Decompiler
- JReversePro
- JUDAR
- JD-CORE/ JD-GUI/ JD Eclipse
JAD Decompiler
JAD är ett kommandoradsprogram. Det är skrivet i C++. Huvudfunktionen är att ta isär .class-filerna. JAD kan distribueras från konsolen, och det kommer att dekompilera Java-klasser till källkoden. På så sätt kan utvecklare titta djupt in i koden för Java runtime-bibliotek och till och med försköna raderna och förbereda dem för en omkompilering. Det finns en risk för överskrivning av källkodsfiler, speciellt när parametern '-o' (skriv över utdatafiler utan bekräftelse) används.
Exempel
Låt oss skapa ett enkelt Java-program som lägger till två nummer.
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); } }
Följ stegen för att konvertera .class till läsbar Java-källkod. Här använder vi JAD decompiler.
Steg 1: Ladda ner JAD-verktyget från https://bit.ly/2XuRzT5
Steg 2: Extrahera zip-filen och hämta jad.exe.
Steg 3: Skapa en .java-fil (DecompilerDemo.java) i samma mapp som du har extraherat zip-filen i.
Steg 4: Kompilera och kör .java-filen. Det kommer att generera en .class-fil i respektive mapp.
Steg 5: Flytta nu .class-filen och jad-programmet till en annan mapp.
Steg 6: Skriv kommandot: jad DecompilerDemo
Kommandot ovan genererar en .jad-fil i respektive mapp.
css wrap text
Steg 7: Skriv kommandot: jad ?s java DecompilerDemo
Den genererar .java-filen i samma mapp.
Öppna DecompilerDemo.java så får vi följande kod:
// 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()); } }
Vi kan observera att den skrivna .java-filen skiljer sig från den genererade .java-filen men ger samma utdata.
Java Class File Disassembler
javap kommando
De javap är ett Java kommandoradsverktyg som kommer med JDK. Den används för att plocka isär klassfilen och skriver ut en läsbar version av den klassen. Dess utdata beror på vilket alternativ som används. Utan att använda något alternativ skriver javap ut paketet, skyddade och offentliga fält och metoder för klasserna som skickas till det. A javap används också för att ta reda på vilka metoder som är tillgängliga för en klass om du inte har källkoden som användes för att skapa klassen. Det allmänna formatet för javap-kommandot är:
javap [options] filename
alternativ
Med javap-kommandot finns många alternativ tillgängliga. Några av dem är:
Ta isär en klassfil med javap-kommandot
class DisassembleDemo { public static void main(String args[]) { System.out.println('Java'); } }
Generera klassfilen för ovanstående program och använd följande kommando för att ta isär klassfilen.
javap -c -p DisassembleDemo
Produktion
Följande utdata visar vad klassfilen har inuti.
Men vi får inte Java-källkoden genom att använda javap-kommandot. Så det finns många dekompilatorer tillgängliga som konverterar en .class-fil till en .java-fil.