5

私は、Java Beanを受け取り、そのすべての値をランダムな値に初期化するユーティリティクラス/コードを探していました。一部のライブラリはすでにtoString()またはequals()メソッドを作成しているため、リフレクションを介して実行できます。たとえば、いくつかのデータを持つUIを開発するときに役立ちます。

持っている他の可能な素敵な:

  1. 非プリミティブまたは単純な(文字列、日付)メンバーも再帰的に初期化します
  2. Beanのコレクションを初期化します
  3. 生成される値を制限する方法を提供するかもしれません。たとえば、範囲を指定できる数値、文字列の正規表現やワイルドカードなどです。

誰かがこのようなことを知っていますか?ありがとう

編集:解決しています... Apocalispのサンプルが機能し、間違いなく私が探していたものです。IMHOにはいくつかの欠点があります。

  • ライブラリはその用途よりもはるかに広い範囲を持っていますが、これは私にとって問題ではありません
  • 全体を研究するために時間を費やさない限り、オブジェクトの任意を構築する方法を理解することは非常に複雑です。これは欠点です。
  • そして、それは私が推測するより簡潔かもしれませんが、それも問題ありません。

ありがとう!

4

6 に答える 6

8

Easy Random をご覧ください: https://github.com/j-easy/easy-random

Java オブジェクト グラフにランダム データを入力できます。

免責事項: 私はそのライブラリの作成者です

于 2016-04-19T18:59:34.930 に答える
2

この投稿が少し古いかもしれないことに気付きましたが、たまたま同じ必要性があり、提示された解決策のどれもそれを受け入れられるように解決していないように見えたので、私はいくつかの簡単で汚い15分間のかなりではないことをしました- ランダムに移入された Bean を生成するための一般的なユーティリティ メソッド。これは、たまたま同様の問題を抱えている他の誰かにとって役立つ場合とそうでない場合があります。

import java.beans.PropertyDescriptor;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Random;

import org.springframework.beans.BeanUtils;

public class RandomBeanUtil {

    public static <T> Collection<T> generateTestData(Class<T> clazz, int quantity) {
        Collection<T> list = new ArrayList<T>();

        PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
        Random rand = new Random();

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);

        try {
            for (int i = 0; i != quantity; i++) {
                    T o = clazz.newInstance();

                    for (PropertyDescriptor descriptor : descriptors) {
                        Class<?> type = descriptor.getPropertyType();
                        if (String.class.isAssignableFrom(type)) {
                            descriptor.getWriteMethod().invoke(o, String.valueOf(new char[]{
                                    (char)('A' + rand.nextInt(26)), (char)('a' + rand.nextInt(26)) }));
                        } else if (Date.class.isAssignableFrom(type)) {
                            cal.add(Calendar.DATE, rand.nextInt(60) - 30);
                            descriptor.getWriteMethod().invoke(o, cal.getTime());
                        } else if (BigDecimal.class.isAssignableFrom(type)) {
                            descriptor.getWriteMethod().invoke(o, 
                                    new BigDecimal(rand.nextDouble() * 500).setScale(2, RoundingMode.HALF_UP));
                        }
                    }

                    list.add(o);
            }       
        } catch (Exception e) {
            // TODO: Improve exception handling
            throw new RuntimeException("Error while generating the bean collection", e);
        }

        return list;
    }

}
于 2012-02-09T16:10:54.027 に答える
1

Reductio ライブラリの Gen クラスを見てください。これは、多かれ少なかれ任意の型の任意の値を生成するための高度に構成可能なフレームワークの一部です。プリミティブ型のジェネレーターとほとんどの Java コレクション クラスが提供されます。Arbitraryクラスのインスタンスをかなり簡単に作成できるはずです。

編集これが修正された例です:

import static fj.test.Arbitrary.*;
import static fj.Function.*;

static final Arbitrary<Person> personArbitrary =
  arbitrary(arbInteger.gen.bind(arbString.gen, arbBoolean.gen,
      curry(new F3<Integer, String, Boolean, Person>() {
        public Person f(final Integer age, final String name, final Boolean male)
          {return new Person(age, name, male);}})));

次に、「サイズ 100」の任意の Person を生成します。つまり、名前は最大で 100 文字です。

Person p = personArbitrary.gen.gen(100, Rand.standard);
于 2009-05-15T13:20:09.357 に答える
0

Apache Commons BeanUtils (http://commons.apache.org/beanutils ) が役に立つかもしれません。すぐに使用できるユーティリティはありませんが、すべてのビルディングブロック、つまりプロパティへのアクセス、ランダムジェネレーターがそこにあると思います。

于 2009-05-15T13:34:22.350 に答える
0

InPUTオープンソース ライブラリを使用して、やりたいことを実行できます。コード内定義ではなく、XML 記述子ベースの範囲定義を使用します。InPUT は、メソッドとコンストラクターの注入を使用して、任意の初期化深度の複雑なオブジェクト構造をサポートします。、およびチュートリアルが利用可能です。

于 2013-05-26T20:02:32.890 に答える
0

私はあなたのためのライブラリを持っていませんが、乱数発生器を手に入れたら、このクラスが役立つかもしれません:

public class BeanMethodIterator implements Iterable<Method> {

    private static final int MODIFIER_FILTER = (Modifier.PUBLIC | Modifier.STATIC);
    private static final int MODIFIER_EXPECTED = Modifier.PUBLIC;

    /**
     * Indicator to filter getter or setter methods. 
     */
    public enum Filter {

        /** Only getter methods. */
        GETTERS(new Transform<Method, Boolean>(){
            public Boolean transform(Method input) {
                return (input.getName().startsWith("get") || 
                        input.getName().startsWith("is")) 
                    &&  input.getParameterTypes().length == 0;
            };
        }),

        /** Only setter methods. */
        SETTTERS(new Transform<Method, Boolean>(){
            public Boolean transform(Method input) {
                return input.getName().startsWith("set") && 
                    input.getParameterTypes().length == 1;
            };
        }),

        /** Getter and setter methods. */
        BOTH(new Transform<Method, Boolean>(){
            public Boolean transform(Method input) {
                return Filter.SETTTERS.condition.transform(input) || 
                    Filter.GETTERS.condition.transform(input);
            };
        });

        private Transform<Method, Boolean> condition;

        private Filter(Transform<Method, Boolean> condition) {
            this.condition = condition;
        }

    };

    /**
     * Iterate parent methods also?
     */
    public enum Scope {
        PARENTS_ALSO() {
            @Override
            protected Method[] getMethods(Class<?> c) {
                return c.getMethods();
            };
        },
        THIS_CLASS_ONLY() {
            @Override
            protected Method[] getMethods(Class<?> c) {
                return c.getDeclaredMethods();
            }
        };

        protected abstract Method[] getMethods(Class<?> c);
    }

    private final Filter filter;
    private final Scope scope;
    private final Class<?> theClass;

    /**
     * Constructor. 
     *
     * @param theClass
     * @param what
     */
    public BeanMethodIterator(Class<?> theClass, Filter what, Scope scope) {
        this.filter = what;
        this.theClass = theClass;
        this.scope = scope;
    }

    /**
     * Constructor. 
     */
    public BeanMethodIterator(Class<?> theClass) {
        this(theClass, Filter.BOTH, Scope.PARENTS_ALSO);
    }

    /**
     * Tells if a method is public
     * @param method
     * @return
     */
    private static boolean isPublic(Method method) {
        return (method.getModifiers() & MODIFIER_FILTER) == MODIFIER_EXPECTED; 
    }

    /**
     * {@inheritDoc}
     * @see java.lang.Iterable#iterator()
     */
    public Iterator<Method> iterator() {
        final Method[] methods = this.scope.getMethods(this.theClass);        

        return new Iterator<Method>() {
            int index = 0;

            public boolean hasNext() {
                while (index < methods.length) {
                    if (isPublic(methods[index]) && filter.condition.transform(methods[index]))
                        return true;
                    index++;
                }
                return false;
            }

            public Method next() {
                if (!hasNext())
                    throw new NoSuchElementException();
                return methods[index++];
            }

            public void remove() {
                throw new UnsupportedOperationException();
            }

        };
    }

    public static void main(String[] args) {
        for (Method m: new BeanMethodIterator(Date.class, Filter.GETTERS, Scope.THIS_CLASS_ONLY)) {
            System.out.println(m.getName());
        }
    }

}


/**
 * Represents a function that takes one input and returns a transformation of that input value i.e.
 * a transformation. The name Transform is used because it is shorter.
 * 
 * @author Hannes de Jager
 * @since 01 Sep 2008
 */
interface Transform<I, O> {

    /**
     * Invokes the function, performing the transformation, to produce an interpreted value.
     * 
     * @param input the input value.
     * @return The computed result.
     */
    public O transform(I input);
}
于 2009-05-15T13:04:05.497 に答える