2016-07-20 7 views
0

私はマルチプレイヤーゲームサーバーを作成しています。ファイルからすべてのワールドデータを動的にロードしたいと思います。これらのファイルは、オブジェクトの配列を動的にロードする必要があります。ファイルからロードするオブジェクトは約3〜4種類あり、コンストラクタ引数の長さは不明です。引数の長さが未知のコンストラクタを呼び出す

保存されたファイルの例:配列に分割されます

arg1, arg2, arg3, arg4 

[arg1, arg2, arg3, arg4] 

次にそれらの引数ここ

new NPC(arg1, arg2, arg3, arg4) 

持つコンストラクタを呼び出す必要があります方法です私は今すぐ持っている

文字列の配列を取るすべてのクラスで

public static <T> T[] load(String path, Class<T> type) ... 

宣言コンストラクタ:

public static <T> void load(String path, Class<T> type) { 
    path = dataDir + path; 
    String content = Util.readFile(path); 
    String[] lines = content.split("\n"); 
    // T[] result = new T[lines.length]; Type paramater 'T' can not be instantiated directly. 
    for (int i = 0; i < lines.length; i++) { 
     String[] args = lines[i].split(", "); 
     // result[i] = new T(args[0], args[1]...); Should add a T to the array with args 'args' 
    } 
    // return result 
} 

そして、それはこの

Npc[] npcs = DataLoader.load("npcs.dat"); 
+0

これは情報が不十分です。議論の種類は何ですか?リフレクションで型をインスタンス化するためにあなたが書いたコードは何ですか?何がうまくいかない?自分で行うには、引数の型を知ってから、適切なコンストラクタを検索するためにリフレクションを使用し、それを呼び出す必要があります。これはJavadocとさまざまなチュートリアルでカバーされていますが、Javadocだけで十分理解できるはずです。 –

+0

あなたはここで車輪を再発明しようとしているようです。 'ObjectOutputStream'と' ObjectInputStream'でシリアル化をチェックアウトしましたか? –

+0

まあ、引数はすべてファイルに文字列として格納されているので、文字列から変換することはすべて可能です。引数の型は整数と文字列だけです。また、すべてのオブジェクトは1つのコンストラクタしか持たないので、引数の型が何であるかを調べ、文字列をその型に自動的に変換したいと考えています。 あなたのコメントがAndrewになったときにこれを入力したところで、私はそれを試してみます。 –

答えて

1

のように呼ばれていますが、一般的な負荷を持っている

public Npc(String[] args)またはpublic Npc(String... args)

次に反射を使用してtantiateジェネリック型:

// instantiate a generic array 
T[] result = (T[]) Array.newInstance(type, length); 
// parameterized constructor of generic type, e.g. new T(String[]) 
Constructor<T> constructorOfT = type.getConstructor(String[].class); 
// call the constructor for every position of the array 
result[i] = constructorOfT.newInstance(new Object[] { args }); 

loadは、任意のタイプまたはコンストラクタ出ないかもしれないで呼び出すことができますので、キャッチ反射例外:

catch (ReflectiveOperationException e) { 
     // means caller did not call one of the supported classes (Npc) 
     // or the class does not have the expected constructor 
     // react in some way 
     e.printStackTrace(); 
} 
+0

ありがとう、これは素晴らしい作品です。 –

関連する問題