Java’s javap command doesn’t show private members (by default)

As I was just reminded, Java’s javap command doesn’t show private members by default. You have to use the -p option of javap to see private members.

I was just reminded of that when using the Scala REPL. Given this Person class with a private constructor field named name:

class Person(private var name: String)

javap without the -p option shows this:

scala> :javap -c Person
Compiled from "<console>"
public class $line3.$read$$iw$$iw$Person {
  public $line3.$read$$iw$$iw$Person(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #18                 // Field name:Ljava/lang/String;
       5: aload_0
       6: invokespecial #27                 // Method java/lang/Object."<init>":()V
       9: return
}

But javap -p shows the private fields related to name, which I’ve made bold below:

scala> :javap -p Person
Compiled from "<console>"
public class $line3.$read$$iw$$iw$Person {
  private java.lang.String name;
  private java.lang.String name();
  private void name_$eq(java.lang.String);
  public $line3.$read$$iw$$iw$Person(java.lang.String);
}

As shown, this includes the private name field, the getter method named name() and the setter method that shows up with the funky name name_$eq.

javap help output

While I’m in the neighborhood, here’s the full javap help output, circa January, 2021:

$ javap -h
Usage: javap <options> <classes>
where possible options include:
  -? -h --help -help               Print this help message
  -version                         Version information
  -v  -verbose                     Print additional information
  -l                               Print line number and local variable tables
  -public                          Show only public classes and members
  -protected                       Show protected/public classes and members
  -package                         Show package/protected/public classes
                                   and members (default)
  -p  -private                     Show all classes and members
  -c                               Disassemble the code
  -s                               Print internal type signatures
  -sysinfo                         Show system info (path, size, date, MD5 hash)
                                   of class being processed
  -constants                       Show final constants
  --module <module>, -m <module>   Specify module containing classes to be disassembled
  --module-path <path>             Specify where to find application modules
  --system <jdk>                   Specify where to find system modules
  --class-path <path>              Specify where to find user class files
  -classpath <path>                Specify where to find user class files
  -cp <path>                       Specify where to find user class files
  -bootclasspath <path>            Override location of bootstrap class files

GNU-style options may use = instead of whitespace to separate the name of an option
from its value.

Each class to be shown may be specified by a filename, a URL, or by its fully
qualified class name. Examples:
   path/to/MyClass.class
   jar:file:///path/to/MyJar.jar!/mypkg/MyClass.class
   java.lang.Object