java - Why is an anonymous inner class containing nothing generated from this code? -


package com.test;  public class outerclass {     public class innerclass {         public class innerinnerclass {          }     }      public class innerclass2 {      }      //this class should not exist in outerclass after dummifying     private class privateinnerclass {         private string getstring() {             return "hello privateinnerclass";         }     }      public string getstringfromprivateinner() {         return new privateinnerclass().getstring();     } } 

when run through javac on command line sun jvm 1.6.0_20, code produces 6 .class files:

outerclass.class
outerclass$1.class
outerclass$innerclass.class
outerclass$innerclass2.class
outerclass$innerclass$innerinnerclass.class
outerclass$privateinnerclass.class

when run through jdt in eclipse, produces 5 classes.

outerclass.class
outerclass$1.class
outerclass$innerclass.class
outerclass$innerclass2.class
outerclass$innerclass$innerinnerclass.class
outerclass$privateinnerclass.class

when decompiled, outerclass$1.class contains nothing. class coming , why created?

i don't have answer, i'm able confirm that, , reduce snippet following:

public class outerclass {     private class privateinnerclass {     }     public void instantiate() {         new privateinnerclass();     } } 

this creates outerclass$1.class

compiled "outerclass.java" class outerclass$1 extends java.lang.object{ } 

and here's javap -c outerclass.class:

compiled "outerclass.java" public class outerclass extends java.lang.object{ public outerclass();   code:    0:   aload_0    1:   invokespecial   #1; //method java/lang/object."<init>":()v    4:   return  public void instantiate();   code:    0:   new     #2; //class outerclass$privateinnerclass    3:   dup    4:   aload_0    5:   aconst_null    6:   invokespecial #3; //method outerclass$privateinnerclass."<init>":                           //(louterclass;louterclass$1;)v    9:   pop    10:  return  } 

and outerclass$privateinnerclass:

compiled "outerclass.java" class outerclass$privateinnerclass extends java.lang.object{ final outerclass this$0;  outerclass$privateinnerclass(outerclass, outerclass$1);   code:    0:   aload_0    1:   aload_1    2:   invokespecial   #1; //method "<init>":(louterclass;)v    5:   return  } 

as can see, synthesized constructor takes outerclass$1 argument.

so javac creates default constructor take argument, of type $1, , value of default argument 5: aconst_null.


i've found $1 doesn't created if either of following true:

  • you make public class privateinnerclass
  • you declare nullary constructor privateinnerclass
  • or don't call new on it
  • probably other things (e.g. static nested, etc).

possibly related

  • bug id:4295934: compiling private inner class creates anonymous class file in wrong dir

create following source in directory called test:

package test; public class testclass {     private class inner     {     }     public testclass()     {         inner in = new inner();     } } 

compile file parent directory javac test/testclass.java

notice file testclass$1.class created in current directory. not sure why file created since there test/testclass$inner.class created well.

evaluation

the testclass$1.class file dummy class needed "access constructor" private constructor of private inner class testclass$inner. dissassembly shows fully-qualified name of class correctly noted, unclear why class file ends in wrong directory.


Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -