2011-01-03 10 views
3

完全修飾クラス名と次元数を指定すると、このクラスのクラス名を取得したいと考えています。私はこのようにすることができると信じていますランタイムのn次元配列のクラスを取得するクラス名

public Class<?> getArrayClass(String className, int dimensions) throws ClassNotFoundException { 
    Class<?> elementType = Class.forName(className); 
    return Array.newInstance(elementType, new int[dimensions]).getClass(); 
} 

しかし、これは私がクラスの不要なインスタンスを作成する必要があります。インスタンスを作成せずにこれを行う方法はありますか?

Class.forName([[[Ljava/lang/String;])(またはアルゴリズム生成バージョン)は、私が見た様々なブログ投稿のすべてのインスタンスで正しく動作するようには見えません。 (bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149)

+0

[[[[Ljava.lang.String; [[[[Ljava/lang/String; – dogbane

+0

うーん、さまざまな投稿がすべての文脈では有効ではないと言っています。 – MeBigFatGuy

+0

クラスのインスタンスではなく、長さが0の配列を作成しています。なぜあなたは、[[[[[Lclassnamehere;] '文字列のアルゴリズム構造は、ゼロの長さの配列を作るよりも安価か何らかの方法で良いと思うのですか?ところで、リンクされたバグは、Class.forName(...)ではなく、 'ClassLoader.loadClass(...)'を参照しています。 – Holger

答えて

-1

私が考えることができる唯一の方法は、文字列の代わりにクラスを渡すことです。

ここで私はここで呼び出し元のクラスがクラスを知っている場合がほとんどであると主張しています。

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

私はクラスを持っていません。私はクラスのシグネチャを読み込み、シグネチャからクラスを作成しようとしています。 – MeBigFatGuy

2

[[[Ljava.lang.String;を使用すると、配列クラス名を表す標準的な方法です。私は現在、Class.forNameのを使用して任意の問題が表示されていない

<?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> 
     ... 

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(); 

は、次の結果が得られます。

XMLEncoderとXMLDecoderのは配列を読み書きするために、標準のJava機能を使用します(例えば、[Lの前に、同じようにJava標準クラスでも使用されているので、自分自身で作成したクラス名を使用して)()を呼び出します。

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

JavaDoc for Class.forNameに記載されているように、クラスはロードされていますが初期化されていないため、インスタンスを作成する必要もありません。

nameが 配列クラスを表す場合、 のコンポーネントタイプは、アレイ・クラスがロードされているが、 は初期化されていません。

これがうまくいかないさまざまなブログ投稿についてのあなたの最後の発言は調査するのが面白いでしょう。

+0

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149を参照してください。 – MeBigFatGuy

関連する問題