I have two compilation units:
public class OuterClass{
private static class InnerClass{
public String test(){
return \"testing123\";
The javap signature for an inner class:
class modifiers.OuterClass$InnerClass extends java.lang.Object{
final modifiers.OuterClass this$0;
public java.lang.String test();
}
When it comes to bytecode (i.e. runtime) there is no such thing as a private class. This is a fiction maintained by the compiler. To the reflection API, there's a package-accessible type with a public member method.
Actual access modifiers are defined in the JVM spec:
Flag Name Value Interpretation
ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its package.
ACC_FINAL 0x0010 Declared final; no subclasses allowed.
ACC_SUPER 0x0020 Treat superclass methods specially when invoked by the
invokespecial instruction.
ACC_INTERFACE 0x0200 Is an interface, not a class.
ACC_ABSTRACT 0x0400 Declared abstract; may not be instantiated.
Private access modifier is stronger than package one (i.e. not having an access modifier at all in Java). Hence private elements of class - be it fields, methods or inner classes - are accessible only within that class.