genericsを使用してjavaでクラスインスタンスをインスタンス化するにはどうすればよいですか?genericsを使用してJavaでクラスインスタンスをインスタンス化するにはどうすればよいですか?
XMLファイルからデータを読み込み、オブジェクトのインスタンスを作成して、オブジェクトの他のプロパティ(XMLファイルから読み取る)をオブジェクトに追加できるようにしようとしています。私はクラスメソッドの名前を読んでセッターを見つける必要がないので、コンストラクタ内のすべての値でオブジェクトをインスタンス化するのが最も簡単な方法だと思っていました。 T obj = new Object()
が、オブジェクトのクラスをあなたのアドバイスのための
private static final boolean string_field = true;
private static <T> T getObject(Element e, String[] fieldNames, boolean[] fieldTypes) {
Object[] values = new Object[fieldNames.length];
for (int i=0; i<fieldNames.length; i++) {
values[i] = (fieldTypes[i]==string_field)? getStringValue(e, fieldNames[i])
: getIntegerValue(e, fieldNames[i]);
}
return new T(values);
}
感謝を得る:私はこのような何かをやろうとしている
はので、私のようなものを持っている必要があります。
EDIT:
は、これは私の更新されたコード(未テスト)である:
public static <T> List<T> populateObjectList(Document xmlDoc, String tagName,
Class clazz, String[] fieldNames, Class[] fieldTypes) {
List<T> objList = new ArrayList<T>();
NodeList nl = xmlDoc.getElementsByTagName(tagName);
if (nl!=null && nl.getLength()>0) {
for (int i=0; i<nl.getLength(); i++) {
Element e = (Element) nl.item(i);
T t;
try {
t = getObject(e, clazz, fieldNames, fieldTypes);
objList.add(t);
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (IllegalArgumentException ex) {
} catch (InvocationTargetException ex) {
} catch (NoSuchMethodException ex) {
}
}
}
return objList;
}
private static <T> T getObject(Element e, Class clazz, String[] fieldNames, Class[] fieldTypes)
throws InstantiationException, IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException {
Object[] initargs = new Object[fieldNames.length];
for (int i=0; i<fieldNames.length; i++) {
initargs[i] = (fieldTypes[i].getName().equals("int"))?
getIntegerValue(e, fieldNames[i])
: getStringValue(e, fieldNames[i]);
}
return (T) clazz.getConstructor(fieldTypes).newInstance(initargs);
}
あなたのいくつかは、私が何をしようとしている理解するであろうように、私はこれを投稿しました。
皆様のアドバイスをいただき、ありがとうございます。
タイプの消去に問題がある可能性があります...? – Steven
私はこのコードが間違っていることを知っています。私はこれを使って達成しようとしていることを説明しました。私は、値の配列にパラメータ値を持つ型Tのオブジェクトをインスタンス化したいと思います。 – Ozzy
@ user1031312:どのようなタイプの 'T 'があると思いますか?それは何とか「要素」に基づいて決定されていますか?もしそうなら、おそらく 'Map>'という要素名をクラスにマッピングするのが望ましいでしょう。テイモンの答えに従ってオブジェクトを構築することができます。あるいは、おそらくあなたの 'getObject()'メソッドは 'Class 'を引数として取るべきです。 –