I am currently working on a project which demands me to decompile a .class file to java file programmatically. I.E. I have a program that should read a class file and decompile it and the resultant java source code is written into a file. Please help me out to do it.
EDIT:
I am completely new to the world of decompilers. I have gone through a few APIs, but i don't know precisely how to use and which one to use. Any sort of help will be really appreciable
EDIT:
I tried using:
import com.strobel.decompiler.*;
import java.io.*;
public class JavaDecode {
public static void main(String[] args)throws Exception {
decompileee();
}
private static void decompileee()throws Exception{
final DecompilerSettings settings = DecompilerSettings.javaDefaults();
final FileOutputStream stream = new FileOutputStream("C:/jp/decompiled.java");
final OutputStreamWriter writer = new OutputStreamWriter(stream);
Decompiler.decompile("C:/jp/X.class", new PlainTextOutput(writer),settings);
System.out.println("Success");
}
}
But the above code simply created a file called "decompiled.java" in the scpecified directory. But the file is an empty file.
Procyon includes a Java decompiler framework. It's written in Java, and it can be called as a library. There's not much documentation yet, but I am the author, and I can assist you if you run into trouble--just contact me on BitBucket.
A simple example of how to decompile java.lang.String
:
final DecompilerSettings settings = DecompilerSettings.javaDefaults();
try (final FileOutputStream stream = new FileOutputStream("path/to/file");
final OutputStreamWriter writer = new OutputStreamWriter(stream)) {
Decompiler.decompile(
"java.lang.String",
new PlainTextOutput(writer),
settings
);
}
catch (final IOException e) {
// handle error
}
You can also pass a .class
file path to the decompile()
method instead of a class name.
If you're not using Java 7, make sure to flush/close your I/O resources manually, e.g.:
try {
final FileOutputStream stream = new FileOutputStream("path/to/file");
try {
final OutputStreamWriter writer = new OutputStreamWriter(stream);
try {
Decompiler.decompile(
"java.lang.String",
new PlainTextOutput(writer),
DecompilerSettings.javaDefaults()
);
}
finally {
writer.close();
}
}
finally {
stream.close();
}
}
catch (final IOException e) {
// handle error
}