This character stem from JVM internal signature and class name representation.
See JVM Specification §4.3.2. Field Descriptors:
B byte signed byte
C char Unicode character code point in the Basic Multilingual Plane,
encoded with UTF-16
D double double-precision floating-point value
F float single-precision floating-point value
I int integer
J long long integer
L ClassName ; reference an instance of class ClassName
S short signed short
Z boolean true or false
[ reference one array dimension
The array type consist of a [
for each dimension, followed by their element signature, e.g. [I
for int[]
. Similiarly, Object[]
is represented by [Ljava/lang/Object;
internally.
It seems, when the conversion from internal class name to application visible name, i.e. returned by Class.getName()
was first implemented, it was implemented as just converting /
to .
but without care for the array notation. Later on, it wasn’t changed for compatibility reasons.
Note the Java 8 introduced getTypeName()
to solve the issue, i.e. String[].class.getTypeName()
yields java.lang.String[]
.