PRIMER.md
A basic understanding of the JVM / class file format is highly reccomended before contributing. Here are some articles that should bring you up to speed:
Qualified name: Package separators using the . character.
These are names used by runtime functions like Class.forName(name).
For example:
java.lang.Stringcom.example.MyClass.InnerClassInternal name: Package separators using the / character.
Inner classes specified with the $ character.
These are names how classes are specified internally in the class file.
For example:
java/lang/Stringcom/example/MyClass$InnerClassPrimitives (Not the boxed types) use single characters:
| Primitive | Internal |
|---|---|
long | J |
int | I |
short | S |
byte | B |
boolean | Z |
float | F |
double | D |
void | V |
Descriptor: Used to describe field and method types.
These are essentially the same as internal names, but class names are wrapped in a prefix (L) and suffix character (;).
For example:
Ljava/lang/String;I (primitives stay the same)Method descriptors are formatted like so:
double method(int i, String s) = (ILjava/lang/String;)Dvoid method() = ()VArrays are prefixed with a [ for each level of the array.
int[] = [IString[][] = [[Ljava/lang/String;Wide types: double and long typed variables take up two slots (On the stack and in the local variable table).
For example, declaring two doubles in a static method will use slots 0, then 2.
Slots 0-3 are all in-use.
Lambdas: The content of a lambda is defined in compiler-generated hidden methods and are invoked with INVOKEDYNAMIC.
Decompilers will in-line the code so that it looks more similar to the source representation.