Wenn ich den folgenden Java-Code ausführe:
%Vor% Ich bekomme java.lang.Object
im Anzeigeterminal, auch wenn ich Object[][].class.getName()
durch [[Ljava.lang.Object
im Code ersetze. Das Problem ist, dass ich erwartet habe, dass die Konsole [[Ljava.lang.Object
anzeigt.
Tatsächlich in der JVM-Spezifikation kann ich Folgendes lesen:
Eine Array-Klasse wird direkt von der Java Virtual Machine (§ 5.3.3) erstellt, nicht von einem Klassenlader. Der definierende Klassenlader von D wird jedoch beim Erstellen der Array-Klasse C verwendet.
Da Object[][]
eine Array-Klasse ist, nahm ich an, dass mein findClass
nicht mit dem Argument [[Ljava.lang.Object
, sondern mit seinem Elementtyp java.lang.Object
aufgerufen würde.
Außerdem wird im Abschnitt "Array-Klassen erstellen" der rekursive Algorithmus beschrieben:
Wenn der Komponententyp ein Referenztyp ist, wird der Algorithmus dieses Abschnitts (§5.3) rekursiv mit dem Klassenlader L angewendet, um den Komponententyp von C. zu laden und dadurch zu erstellen.
Meine Fragen sind also:
Sie fragen nach der JVM-Spezifikation, aber Ihr Test zeigt das Verhalten von java.lang.ClassLoader
, einer unabhängigen Klasse, die "in der Java-Virtual Machine zum Auflösen von Klassenreferenzen ". Wenn die JVM eine Array-Klasse lädt, wird der Class Loader vollständig umgangen. Dies kann demonstriert werden, indem die JVM versucht, die Klasse mit einem benutzerdefinierten Klassenlader zu laden:
Ausgabe:
%Vor%Wie Sie sehen, wird der Komponententyp zunächst über den Klassenlader geladen, aber die Array-Typen werden implizit geladen.
Tags und Links java jvm classloader