-
Notifications
You must be signed in to change notification settings - Fork 6
Descriptors
The JVM has simple single-character names for each primitive type.
Type | Descriptor |
---|---|
long |
J |
int |
I |
short |
S |
byte |
B |
boolean |
Z |
float |
F |
double |
D |
void |
V |
In the JVM descriptors are used to describe both methods and fields. You can identify if a descriptor is a method descriptor if it for example contains parentheses. If not it is a field descriptor.
Here is a simple method:
int add(int a, int b) {
return a + b;
}
The descriptor for this method would be:
(II)I
Even if a method has no arguments it will still contain parentheses like:
()V
is an example of a void method that would look like this:
void doSomething() {}
Inside of the parentheses we see two integer primitive types which in our source file are:
(int a, int b)
The return type is specified at the ending of the descriptor which we can see is an integer primitive.
Here is a more complex method:
String concat(String a, String b) {
return a + b;
}
Now we've only seen primitive types yet, but what about parameters that aren't primitives like:
For example java.lang.String
is obviously a class, so what would be the descriptor for the concat()
method?
(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
is the descriptor.
Might seem scary but it isn't. In the JVM classes in descriptors need to have a prefix and a suffix,
the prefix being L
and the suffix being ;
let's say you have a class in:
me.myname.MyClass
If you wanted to use it in a descriptor, it would be:
Lme/myname/Myclass;
Field descriptors are the same as method descriptors just that they don't have parentheses because they aren't methods and obviously don't need arguments.
Here is an example field:
String food = "Pancakes!"
The descriptor for it would simply be the class using the same prefix and suffix convention while containing NO PARENTHESES:
Ljava/lang/String;
For array types [
is added as a prefix:
Descriptor | Java Type |
---|---|
[I |
int[] |
[J |
long[] |
[Ljava/lang/String; |
String[] |