Menu

#2 Correct decompilation of inner classes fails

open
nobody
None
5
2014-12-08
2006-11-12
Anonymous
No

The following code compiled with the Sun Java compiler
version 1.3.1_19 is not successfully decompiled, that
is recompilation of the compiled class file fails.

//---------------------------------------------------
/* Original source of InnerClassTest.java */
public class InnerClassTest {
public InnerClass myInnerClass;

InnerClassTest\(\) \{
    myInnerClass = new InnerClass\(\);
\}

class InnerClass \{
    private String sValue;

    InnerClass\(\) \{
        sValue = "Constructor of InnerClass called";
    \}

    public String getValue\(\) \{
        return sValue;
    \}
\}

public static void main\(String\[\] args\) \{
    InnerClassTest myInnerClassTest;

    myInnerClassTest = new InnerClassTest\(\);

System.out.println(myInnerClassTest.myInnerClass.getValue());
}
}
//---------------------------------------------------

//---------------------------------------------------
/* Decompiled source of InnerClassTest.class */
// Decompiled by jdec

// DECOMPILER HOME PAGE:
http://sourceforge.net/projects/jdec
// Copyright (C)2006 Swaroop Belur.
// jdec comes with ABSOLUTELY NO WARRANTY;
// This is free software, and you are welcome to
redistribute
// it under certain conditions;
// See the File 'COPYING' for more details.

/**** List of All Imported Classes ***/

import java.io.PrintStream;
import java.lang.Object;
import java.lang.System;

// End of Import

public class InnerClassTest extends Object
{

public InnerClassTest$InnerClass myInnerClass ;

public static void main(String [] param_0)
{

InnerClassTest JDecGenerated2=new InnerClassTest();
InnerClassTest Var_7_1=JDecGenerated2;

System.out.println(Var_7_1.myInnerClass.getValue());
return;

}

InnerClassTest( )
{
super();
InnerClassTest$InnerClass JDecGenerated7=new
InnerClassTest$InnerClass(this);
this.myInnerClass =JDecGenerated7;
return;

}

}
//---------------------------------------------------

//---------------------------------------------------
Compiler errors:
InnerClassTest.java:25: cannot resolve symbol
symbol : class InnerClassTest$InnerClass
location: class InnerClassTest
public InnerClassTest$InnerClass myInnerClass ;
^
InnerClassTest.java:41: cannot resolve symbol
symbol : class InnerClassTest$InnerClass
location: class InnerClassTest
InnerClassTest$InnerClass JDecGenerated7=new
InnerClassTest$InnerClass(this);
^
InnerClassTest.java:41: cannot resolve symbol
symbol : class InnerClassTest$InnerClass
location: class InnerClassTest
InnerClassTest$InnerClass JDecGenerated7=new
InnerClassTest$InnerClass(this);
^
3 errors

Discussion

  • Nobody/Anonymous

    Original source of InnerClassTest.java

     
  • Nobody/Anonymous

    Logged In: NO

    Decompiling InnerClassTest$InnerClass.class produces
    InnerClassTest$InnerClass.java. Recompiling the two java
    files generate other errors:

    //---------------------------------------------------
    /* Decompiled source of InnerClassTest$InnerClass.class */

    // Decompiled by jdec

    // DECOMPILER HOME PAGE: http://sourceforge.net/projects/jdec
    // Copyright (C)2006 Swaroop Belur.
    // jdec comes with ABSOLUTELY NO WARRANTY;
    // This is free software, and you are welcome to redistribute
    // it under certain conditions;
    // See the File 'COPYING' for more details.

    /**** List of All Imported Classes ***/

    import java.lang.Object;
    import java.lang.String;

    // End of Import

    class InnerClassTest$InnerClass extends Object
    {

    private String sValue ;
    private final InnerClassTest this$0 ;

    public String getValue( )
    {
    return this.sValue;

    }

    InnerClassTest$InnerClass(InnerClassTest param_1)
    {
    super();
    this.This$0 =param_1;
    this.sValue ="Constructor of InnerClass called";
    return;

    }

    }
    //---------------------------------------------------

    //---------------------------------------------------
    Compiler errors:
    .\InnerClassTest$InnerClass.java:25: this$0 is reserved for
    internal use
    private final InnerClassTest this$0 ;
    ^
    .\InnerClassTest$InnerClass.java:37: cannot resolve symbol
    symbol : variable This$0
    location: class InnerClassTest$InnerClass
    this.This$0 =param_1;
    ^

     
  • Nobody/Anonymous

    Logged In: NO

    Replacing line 25 which reads:
    private final InnerClassTest this$0 ;

    with:
    private final InnerClassTest This$0 ;

    Solves the problem and successfully compiles the decompiled
    sources, but this clearly is a bug in the Jdec Java
    Decompiler I think.

     

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.