私はストレステストの目的で任意のクラスのランダムジェネレータを作成しようとしています。 (反射による)クラス<?>がリフレクションで他のインスタンスになっているかどうかを確認する
私の発電目標がデフォルトコンストラクタを持つクラスを作成し、そのプリミティブと文字列フィールドを埋めるために
私はNumber型(整数、ロング、ダブル....)のフィールドを埋めるためにも希望それらは簡単にプリミティブに変換可能です。
しかし、タイプ間の簡単なアプローチo instanceof
を見つけることができませんでした。問題を引き起こしものであればここで
public static <V> Collection<V> createMassiveCollection(Class<V> clazz, int amount, Class<?> collectionType) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
Random r = new Random();
RandomGenerator rg = new RandomGenerator();
@SuppressWarnings("unchecked")
Collection<V> collection = (Collection<V>) collectionType.newInstance();
for (int i = 0; i < amount; i++) {
V item = clazz.newInstance();
for (Field field : item.getClass().getDeclaredFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers()) || java.lang.reflect.Modifier.isFinal(field.getModifiers()))
continue;
field.setAccessible(true);
if (field.getType().equals(String.class))
field.set(item, rg.nextCompliment());
else if (field.getType().isPrimitive() && (field.getType() != boolean.class && field.getType() != byte.class && field.getType() != char.class))
field.set(item, r.nextInt(1000000));
else {
Constructor<?> c = null;
try {
c = field.getType().getConstructor(String.class);
}
catch (Exception e) {}
if (c != null && Number.class.isInstance(c.newInstance("1")))
field.set(item, field.getType().getConstructor(String.class).newInstance(r.nextInt(1000000) + ""));
}
}
collection.add(item);
}
return collection;
}
第三である 私のような何かをしたいと思います: 「Type<C>
はType<V>
のサブタイプがある場合は、」しかし、すべての方法は、私は、オブジェクトの有効なインスタンスを必要としましたチェックする。
ex。 field.getType()
がTypeのインスタンスであるため、 Number.class.isInstance(field.getType())
でもfield.getType() instanceof Number
が機能します。
誰でも知ることができますか?
もう一つの問題(重要度の低い)私のメソッドシグネチャで私は
Class<? extends Collection<V>> collectionType
を持っていると思いますが、私は
createMassiveCollection(User.class, 100000, new ArrayList<User>().getClass());
のようなメソッドを呼び出すようにしようとすると、コンパイラが失敗したことを行うと!コンパイルできるようにするには、ユーザがCollectionをパラメータとして継承する型を渡していると信じなければならない
'new ArrayList().getClass()'は常に* erase * type 'Class <?を返します。 extends ArrayList >> 'のように、' Class <? Collection > '' unsafe ''キャスティングで拡張しました。そして、実際にはそれを行う必要はありません。なぜなら、 'Class <? extendsコレクション>> 'はあなたのニーズに完全に適しています:とにかく新しいコレクションを作成して記入すると、そのコレクションタイプが' 'なら本当に気になる人ですか? –