2

特定のオブジェクトのすべてのプロパティにランダムな値を入力する必要があります。これらは私の要件です:

  • すべてのプロパティはネイティブ Java タイプ ( intdoubleStringなど)
  • リフレクションが使える
  • 私は春を使うことができますDirectFieldAccessor

四角い車輪を再発明したくないので、質問したいと思います。今のところ、私はこれを思いつきました:

次を使用してすべてのプロパティ名を取得します。

Field field : myObject.getClass().getDeclaredFields()

これらのフィールドを反復処理して、クラスを取得します。

既知のネイティブ Java タイプごとに巨大な switch ステートメントを使用し、ランダムな値を生成します。

どう思いますか?

4

4 に答える 4

1

これは 、ランダム データ生成用のランダマイザーの 1 つです。これは、言及したように、リフレクションの概念のみを使用します。フィールドに記載されているアノテーションをチェックし、それに基づいて Provider クラスをチェックします。Person モデル クラスを通過します。その中には、いくつかのプリミティブおよび非プリミティブの fo フィールドがあります。

public class Person {

   @FirstName
   public String mFirstName;

   @LastName
   public String mLastName;

   @Number(min = 14,max = 25,decimals = 0)
   public int age;

   @Email
   public String mEmailId;

   @ReferenceRecord(clazz = Address.class)
   public Address address;

}

@ReferencedRecord
public class Address {

   @StreetAddress
   public String streetAddress;

   @State
   public String state;
}

//Generate random 100 Person(Model Class) object 
Generator<Person> generator = new Generator<>(Person.class);  
List<Person> persons = generator.generate(100);                          

アノテーションを使用してアクセスできる組み込みのデータ ジェネレーターが多数あるため、 @CustomGeneratorアノテーションを使用してカスタム データ ジェネレーターを構築することもできます。ライブラリ ページで提供されているドキュメントを参照することをお勧めします。

于 2016-10-24T18:29:23.123 に答える
0

MockNeatと呼ばれるライブラリを使用して、オブジェクトを「本物」として渡すことができる任意のデータでプログラム的に「埋める」ことができます。

たとえば、オブジェクトを設定するには、reflect()メソッドを参照してください。

// Creates a MockNeat object that internally uses
// a ThreadLocalRandom.
MockNeat m = MockNeat.threadLocal();

List<Employee> companyEmployees =
                m.reflect(Employee.class) // The class we are mocking
                 .field("uniqueId",
                        m.uuids()) // Generates a random unique identifier
                 .field("id",
                        m.longSeq()) // Generates long numbers in a sequence
                 .field("fullName",
                        m.names().full()) // Generates a full name for the employer
                 .field("companyEmail",
                        m.emails().domain("company.com")) // Generates a company email with a given domain
                 .field("personalEmail",
                        m.emails()) // Generates an arbitrary email without domain constraints
                 .field("salaryCreditCard",
                        m.creditCards().types(AMERICAN_EXPRESS, MASTERCARD)) // Generate credit card numbers of 'types'
                 .field("external",
                        m.bools().probability(20.0)) // Generates Boolean values with 20% probability of obtaining True
                 .field("hireDate",
                        m.localDates().past(of(1999, 1, 1))) // Generatest a date in the past, but greater than 01.01.1987
                 .field("birthDate",
                        m.localDates().between(of(1950, 1, 1), of(1994, 1, 1))) // Generates a data in the given range
                 .field("pcs",
                        m.reflect(EmployeePC.class) // Mock an EmployeePC object
                         .field("uuid",
                                m.uuids()) // Generates an unique identifier
                         .field("username",
                                m.users()) // Generates an arbitrary username
                         .field("operatingSystem",
                                m.from(new String[]{"Linux", "Windows 10", "Windows 8"})) // Randomly selects an OS from the given List
                         .field("ipAddress",
                                m.ipv4s().type(CLASS_B)) // Generates a CLASS B IPv4 Address
                         .field("macAddress",
                                m.macs()) // Generates a MAC Address
                         .list(2)) // Creates a List<EmployeePC> with 2 values
                 .list(1000) // Creates a List<Employee> with 1000 values
                 .val(); // Returns the list

後で編集:

私の最初の回答以来、データを生成する方法が追加されました。

于 2017-12-15T16:11:08.087 に答える