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 theretest/testclass$inner.class
created well.evaluation
the
testclass$1.class
file 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