java-decompiler/jd-core

Try with resource statement is not decompiled properly

sarulmurugan opened this issue · 0 comments

This code is not decompiled properly. It is an example code that was provided by you.

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.jd.core.v1.ClassFileToJavaSourceDecompiler;
import org.jd.core.v1.api.loader.Loader;
import org.jd.core.v1.api.loader.LoaderException;
import org.jd.core.v1.api.printer.Printer;

//$Id$

public class Test {

public static void main(String[] args) throws Exception {
	
	Loader loader = new Loader() {
	    @Override
	    public byte[] load(String internalName) throws LoaderException {
	        InputStream is = this.getClass().getResourceAsStream("/" + internalName + ".class");

	        if (is == null) {
	            return null;
	        } else {
	            try (InputStream in=is; ByteArrayOutputStream out=new ByteArrayOutputStream()) {
	                byte[] buffer = new byte[1024];
	                int read = in.read(buffer);

	                while (read > 0) {
	                    out.write(buffer, 0, read);		     
	                    read = in.read(buffer);
	                }

	                return out.toByteArray();
	            } catch (IOException e) {
	                throw new LoaderException(e);
	            }
	        }
	    }

	    @Override
	    public boolean canLoad(String internalName) {
	        return this.getClass().getResource("/" + internalName + ".class") != null;
	    }
	};
	
	Printer printer = new Printer() {
	    protected static final String TAB = "  ";
	    protected static final String NEWLINE = "\n";

	    protected int indentationCount = 0;
	    protected StringBuilder sb = new StringBuilder();

	    @Override public String toString() { return sb.toString(); }

	    @Override public void start(int maxLineNumber, int majorVersion, int minorVersion) {}
	    @Override public void end() {}

	    @Override public void printText(String text) { 
	    	sb.append(text); 
	    	}
	    @Override public void printNumericConstant(String constant) {
	    	sb.append(constant); }
	    @Override public void printStringConstant(String constant, String ownerInternalName) {
	    	sb.append(constant); }
	    @Override public void printKeyword(String keyword) { 
	    	sb.append(keyword); }
	    @Override public void printDeclaration(int type, String internalTypeName, String name, String descriptor) {
	    	sb.append(name); }
	    @Override public void printReference(int type, String internalTypeName, String name, String descriptor, String ownerInternalName) { 
	    	sb.append(name); 
	    }

	    @Override public void indent() { this.indentationCount++; }
	    @Override public void unindent() { this.indentationCount--; }

	    @Override public void startLine(int lineNumber) { 
	    	for (int i=0; i<indentationCount; i++) 
	    		sb.append(TAB);
	    	}
	    @Override public void endLine() { 
	    	sb.append(NEWLINE);
	    }
	    @Override public void extraLine(int count) { while (count-- > 0) sb.append(NEWLINE); }

	    @Override public void startMarker(int type) {}
	    @Override public void endMarker(int type) {}
	};
	
	ClassFileToJavaSourceDecompiler decompiler = new ClassFileToJavaSourceDecompiler();

	Map<String,Object> conf = new ConcurrentHashMap<String, Object>();
	
	
	decompiler.decompile(loader, printer, "Test$1",conf);

	String source = printer.toString();
	
	System.out.println(source);	
}

}

Result after decompiling Test$2 is

import java.io.IOException;
import java.io.InputStream;
import org.jd.core.v1.api.loader.Loader;
import org.jd.core.v1.api.loader.LoaderException;

class null implements Loader {
public byte[] load(String internalName) throws LoaderException {
is = getClass().getResourceAsStream("/" + internalName + ".class");
if (is == null)
return null;
try {
throwable1 = null;
throwable2 = null;
try {

  } finally {
    throwable2 = null;
    if (throwable1 == null) {
      throwable1 = throwable2;
    } else if (throwable1 != throwable2) {
      throwable1.addSuppressed(throwable2);
    } 
  } 
} catch (IOException e) {
  throw new LoaderException(e);
} 

}

public boolean canLoad(String internalName) { return (getClass().getResource("/" + internalName + ".class") != null); }
}