2016-10-20 3 views
2

私はjackson経由でCSVをダンプしています。私はいくつかのマッピングクラスを持っており、マッピングクラスをCSVエクスポートメソッドに渡したいと思っています。Javaでコンストラクタをリフレクション経由で呼び出すにはどうすればよいですか?

私は抽象クラスを持っており、これを各csvカラムフォーマットに拡張しました。クラスの名前をエクスポート関数に渡し、そのクラスのコンストラクタを介してデータをマップし、CSVとしてダンプします。

マッピングを実行してエクスポートされるクラスを作成するまでは問題ありません。

呼び出し例外/無効なパラメータ数の例外です。

protected String mapTransactionsToCSV(List<Object[]> results, String rowClassName) 
    Class rowClass = Class.forName(rowClassName); 
    for (Object[] component : results) 
    VehicleAbstract vehicle = (VehicleAbstract) rowClass.getDeclaredConstructor(Object[].class).newInstance(component); 
    csv.append(mapper.writer(schema).writeValueAsString(vehicle)); 
    } 
} 

私の特定のクラス(および抽象クラス、試しにコピーしたもの)。 2つのコンストラクタ

public Bus() {} 
public Bus(Object[] component) {} 
+0

良い質問 - すばやく整形し、素敵な、きちんとした例を与えてくれてありがとう。常に助けてください=) – Addison

答えて

3

は、問題がnewInstanceはすでにオブジェクトの配列を取ることであるProblem with constructing class using reflection and array arguments

を参照してくださいました。オブジェクト配列をの別の配列にラップする必要があります。このような何か:

component = {component}; // Wrap in a new object array 
VehicleAbstract vehicle = (VehicleAbstract) rowClass.getDeclaredConstructor(Object[].class).newInstance(component); 

これは、あなたがパラメータの無効な番号を取得している理由です - あなたは、別のパラメータとして、そのオブジェクトの配列内の各アイテムを渡している、代わりに一つのパラメータの(オブジェクトの配列)。

+0

重複していると思われる場合は、それを閉じるようにフラグを立ててください。結局、[あなたが3kの評判を持っているとき](http://stackoverflow.com/help/privileges/close-questions)、投票することもできます。 –

+0

これからは@SotiriosDelimanolisをやっていきます。私はちょうど特権を得たので、私はフラッグ幸せに行きたくはありませんでした。それに、私はSOソリューション(2回目の検索後)が見つかる前に、それに答える手間を覚えました。 – Addison

関連する問題