Een Java-decompiler is een speciaal type decompiler die een klassenbestand als invoer gebruikt en Java-broncode als uitvoer produceert. Decompilatie is precies het omgekeerde proces van compilatie. Decompiler produceert dus geen replica van de broncode. Dit komt doordat er een stukje informatie uit de broncode verloren gaat tijdens het compileren van het programma.
Maar er zijn veel complexiteiten: Java-code is bijvoorbeeld gestructureerd en bytecode is niet gestructureerd. Bovendien is de transformatie niet één op één: twee verschillende Java-programma's kunnen identieke bytecode opleveren.
Er zijn de volgende Java-decompilers beschikbaar:
- DJ Java-decompiler
- JReversePro
- JODEN
- JD-CORE/JD-GUI/JD Eclipse
JAD-decompiler
De JAD is een opdrachtregeltoepassing. Het is geschreven in C++. De belangrijkste functie is het demonteren van de .class-bestanden. JAD kan vanaf de console worden geïmplementeerd en zal Java-klassen in de broncode decompileren. Op deze manier kunnen ontwikkelaars diep in de code van Java-runtimebibliotheken kijken en zelfs de regels verfraaien en ze voorbereiden op een hercompilatie. Er bestaat een risico dat de broncodebestanden worden overschreven, vooral wanneer de parameter '-o' (uitvoerbestanden overschrijven zonder bevestiging) wordt gebruikt.
Voorbeeld
Laten we een eenvoudig Java-programma maken dat twee getallen toevoegt.
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); } }
Volg de stappen om de .class om te zetten in leesbare Java-broncode. Hier gebruiken we de JAD-decompiler.
Stap 1: JAD-tool downloaden van https://bit.ly/2XuRzT5
Stap 2: Pak het zipbestand uit en download jad.exe.
Stap 3: Maak een .java-bestand (DecompilerDemo.java) in dezelfde map waarin u het zipbestand hebt uitgepakt.
Stap 4: Compileer en voer het .java-bestand uit. Er wordt een .class-bestand gegenereerd in de betreffende map.
Stap 5: Verplaats nu het .class-bestand en de jad-applicatie naar een andere map.
Stap 6: Typ de opdracht: jad DecompilerDemo
Bovenstaande opdracht genereert een .jad-bestand in de betreffende map.
Stap 7: Typ de opdracht: jad ?s java DecompilerDemo
Het genereert het .java-bestand in dezelfde map.
Open de DecompilerDemo.java en we krijgen de volgende code:
// 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()); } }
We kunnen zien dat het geschreven .java-bestand verschilt van het gegenereerde .java-bestand, maar dezelfde uitvoer geeft.
Java-klasse bestandsdisassembler
Javap-opdracht
De Java is een Java-opdrachtregelprogramma dat wordt geleverd met JDK. Het wordt gebruikt om het klassenbestand te demonteren en een voor mensen leesbare versie van die klasse af te drukken. De output is afhankelijk van de gebruikte optie. Zonder enige optie te gebruiken, drukt Javap het pakket, de beveiligde en openbare velden en methoden van de klassen af die eraan zijn doorgegeven. A Java wordt ook gebruikt om erachter te komen welke methoden beschikbaar zijn voor een klasse als u niet over de broncode beschikt die is gebruikt om de klasse te maken. Het algemene formaat van de Javap-opdracht is:
javap [options] filename
Opties
'wat' is 10 van 100'
Met de Javap-opdracht zijn er veel opties beschikbaar. Sommige ervan zijn:
Demonteer een klassenbestand met behulp van de Javap-opdracht
class DisassembleDemo { public static void main(String args[]) { System.out.println('Java'); } }
Genereer het klassenbestand van het bovenstaande programma en gebruik de volgende opdracht om het klassenbestand te demonteren.
javap -c -p DisassembleDemo
Uitvoer
De volgende uitvoer laat zien wat het klassenbestand bevat.
Maar we krijgen de Java-broncode niet met behulp van de Javap-opdracht. Er zijn dus veel decompilers beschikbaar die een .class-bestand naar een .java-bestand converteren.