2011-01-03 10 views
3

Angesichts eines vollständig qualifizierten Klassennamens und einer Reihe von Dimensionen möchte ich den Klassennamen für diese Klasse abrufen. Ich glaube, ich kann dies wie folgt tunAbrufen der Klasse eines n-dimensionalen Arrays eines Laufzeitklassennamens

Allerdings erfordert dies, dass ich eine nicht benötigte Instanz der Klasse erstellen. Gibt es eine Möglichkeit, dies zu tun, ohne die Instanz zu erstellen?

Es scheint nicht, dass Class.forName ("[[[[Ljava/lang/String;")) (oder eine algorithmisch generierte Version) in allen Instanzen korrekt aus verschiedenen Blogposts funktioniert, die ich gesehen habe. (bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149)

+0

sollte es nicht sein [[[[Ljava.lang.String; statt [[[[Ljava/lang/String ;? – dogbane

+0

Nun, so oder so, verschiedene Beiträge sagen, das ist nicht in allen Kontexten gültig. – MeBigFatGuy

+0

Sie erstellen keine Instanz der Klasse, sondern ein Array der Länge Null. Warum denkst du, ist die algorithmische Konstruktion der "[[[[KlassennameHierarchie]" -Strange billiger oder in irgendeiner Weise besser als die Konstruktion eines Nulllängen-Arrays? Der verlinkte Fehler bezieht sich übrigens auf 'ClassLoader.loadClass (...)' nicht auf 'Class.forName (...)'. – Holger

Antwort

-1

Der einzige Weg, an den ich denken könnte, ist die Klasse statt String übergeben.

Der Punkt ist, dass ich annehme, hier ist, die aufrufende Klasse, kann für die meisten Fälle sein, die Klasse zu kennen.

public V[] getArrayClass(Class<V> c, int dimensions) throws ClassNotFoundException { 
    return (V[])Array.newInstance(c, new int[dimensions]).getClass(); 
    /* The type cast is required. Since Array.newInstance 
    is not genrically parameterized. */ 
} 
+0

Ich habe die Klasse nicht. Ich verwende asm, um die Klassensignatur zu lesen und zu versuchen, die Klasse aus der Signatur zu erstellen. – MeBigFatGuy

2

Verwenden der [[[Ljava.lang.String; Notation ist der normale Weg Array Klassennamen darstellen.

Der XMLEncoder und XMLDecoder verwenden Standard-Java-Funktionalität zum Schreiben und Lesen Arrays:

String[][][] foo = new String[3][4][5]; 
foo[0][0][0] = "a"; 
foo[2][3][4] = "z"; 
XMLEncoder encoder = new XMLEncoder(System.out); 
encoder.writeObject(foo); 
encoder.flush(); 
encoder.close(); 

ergibt folgendes Ergebnis:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_22" class="java.beans.XMLDecoder"> 
<array class="[[Ljava.lang.String;" length="3"> 
    <void index="0"> 
    <array class="[Ljava.lang.String;" length="4"> 
    <void index="0"> 
    <array class="java.lang.String" length="5"> 
     <void index="0"> 
     <string>a</string> 
     ... 

ich derzeit sehe kein Problem in Class.forName mit() mit einem selbst erstellten Klassennamen (z. B. dem [L vorangestellt, da er auch von den Java-Standardklassen in gleicher Weise verwendet wird.

Class arrayClass = Class.forName("[L" + "java.lang.String" + ";"); 

Und wie die JavaDoc for Class.forName beschreibt, ist die Klasse geladen, aber nicht initialisiert, und Sie müssen auch keine Instanz dafür erstellen.

Wenn name eine Array-Klasse bezeichnet wird das Bauteil Typ die Array-Klasse geladen, aber nicht initialisiert.

Ihre letzte Bemerkung zu verschiedenen Blog-Posts, wo dies nicht funktionieren würde, wäre interessant zu untersuchen.

+0

Siehe http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149 – MeBigFatGuy

Verwandte Themen