Der ClassLoader kann das Array durch irgendetwas ersetzen

9

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:

  • Warum bekomme ich diese Ausgabe? Bedeutet das, dass ich diesen rekursiven Algorithmus manuell in meinen ClassLoader einbinden muss, anstatt die JVM das für mich tun zu lassen? Wenn das ist, was es bedeutet, was ist der beste Weg, es zu tun?
  • Missdeute ich das "Erschaffene" im ersten Zitat? Bedeutet es nur, dass ich die Runtime-Array-Klasse nicht erstellen kann, aber das Laden immer noch patchen kann?
Codoscope 13.12.2016, 02:26
quelle

1 Antwort

4

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:

%Vor%

Ausgabe:

%Vor%

Wie Sie sehen, wird der Komponententyp zunächst über den Klassenlader geladen, aber die Array-Typen werden implizit geladen.

    
shmosel 13.12.2016, 03:01
quelle

Tags und Links