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
newon it - probably other things (e.g.
staticnested, 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.javanotice file
testclass$1.classcreated in current directory. not sure why file created since theretest/testclass$inner.classcreated well.evaluation
the
testclass$1.classfile dummy class needed "access constructor" private constructor of private inner classtestclass$inner. dissassembly shows fully-qualified name of class correctly noted, unclear why class file ends in wrong directory.
Comments
Post a Comment