Member inner class compilation description.
We will discuss how member inner classes are compiled.
Reference: https://www.amazon.com/Java-Language-Features-Modules-Expressions/dp/1484233476
A member inner class is defined inside a class the same
way a member field or a member method. It could be private,
package-level, protected, public.
Naming convention: <outer-class-name>$<member-inner-class-name>
+
(plus)$JDKPath$\bin\javap.exe
-c $FileClass$
-c
Prints out disassembled code$OutputPath$
The easiest example, package: easy
class Outer {
class Inner {
}
}
is compiled to two classes:
Outer$Inner.class
class Outer$Inner {
final Outer this$0;
Outer$Inner(Outer outer) {
this$0 = outer;
super();
}
}
Outer
instance was addedsuper()
is after setting the fieldOuter
is inserted during compilationOuter.class
class Outer {
Outer() {
}
}
Outer
and Inner
is removedInner class has constructor, package: constructor
class Outer {
class Inner {
Inner(String s) {
}
}
}
is compiled to two classes:
Outer$Inner
class Outer$Inner {
final Outer this$0;
Outer$Inner(Outer outer, String s) {
this$0 = outer;
super();
}
}
Outer
) was added to the existing constructorOuter.class
same as (1.)
accessing private fields, package: accessing.priv
class Outer {
private String s = "outer";
class Inner {
String getS() {
return s;
}
}
}
is compiled to two classes:
Outer.class
class Outer {
private String s = null;
Outer() {
s = "outer";
}
static String access$000(Outer outer) {
return outer.s;
}
}
Outer$Inner
class Outer$Inner {
final Outer this$0;
Outer$Inner(Outer outer) {
this$0 = outer;
super();
}
String getS() {
return Outer.access$000(this$0);
}
}
accessing non-private fields, package: accessing.npriv
class Outer {
String s = "outer";
class Inner {
String getS() {
return s;
}
}
}
is compiled to two classes:
Outer$Inner
class Outer$Inner {
final Outer this$0;
Outer$Inner(Outer outer) {
this$0 = outer;
super();
}
String getS() {
return this$0.s;
}
}
Outer.class
class Outer {
private String s = null;
Outer() {
s = "outer";
}
}