Apache CommonsのBeanUtils

Apache Commons BeanUtils

1. 概要

Apache Commons BeansUtilsには、Java Beanの操作に必要なすべてのツールが含まれています。

簡単に言えば、Beanは、フィールド、ゲッター/セッター、および引数なしのコンストラクターを含む単純なJavaクラスです。

Javaは、getter-setterメソッドを識別して動的に呼び出すためのリフレクションおよびイントロスペクション機能を提供します。 ただし、これらのAPIを習得するのは難しく、開発者が最も単純な操作を実行するための定型コードを記述する必要がある場合があります。

2. Mavenの依存関係

Maven依存関係は、使用する前にPOMファイルに含める必要があります。


    commons-beanutils
    commons-beanutils
    1.9.3

最新バージョンはhereで見つけることができます。

3. JavaBeanの作成

典型的なgetterメソッドとsetterメソッドを使用して2つのBeanクラスCourseStudentを作成しましょう。

public class Course {
    private String name;
    private List codes;
    private Map enrolledStudent = new HashMap<>();

    //  standard getters/setters
}
public class Student {
    private String name;

    //  standard getters/setters
}

コース名、コースコード、および複数の登録済み学生を含むCourseクラスがあります。 登録済みの学生は、一意の登録IDによって識別されます。 Courseクラスは、登録済みの学生をMapオブジェクトに保持します。ここで、登録IDがキーであり、学生オブジェクトが値になります。

4. プロパティへのアクセス

Beanプロパティは3つのカテゴリに分類できます。

4.1. シンプルなプロパティ

単一値プロパティは、単純またはスカラーとも呼ばれます。

それらの値は、プリミティブ(int、floatなど)または複合型オブジェクトの場合があります。 BeanUtilsには、Java Beanの単純なプロパティを変更できるPropertyUtilsクラスがあります。

プロパティを設定するコードの例を次に示します。

Course course = new Course();
String name = "Computer Science";
List codes = Arrays.asList("CS", "CS01");

PropertyUtils.setSimpleProperty(course, "name", name);
PropertyUtils.setSimpleProperty(course, "codes", codes);

4.2. インデックス付きプロパティ

インデックス付きプロパティには、インデックス番号を使用して個別にアクセスできる値としてのコレクションがあります。 BeanUtilsは、JavaBeanの拡張機能として、java.util.List型の値もインデックス付きと見なします。

PropertyUtils’ssetIndexedPropertyメソッドを使用して、インデックス付きプロパティの個々の値を変更できます。

インデックス付きプロパティを変更するコードの例を次に示します。

PropertyUtils.setIndexedProperty(course, "codes[1]", "CS02");

4.3. マッピングされたプロパティ

基になるタイプとしてjava.util.Mapを持つプロパティは、マップされたプロパティと呼ばれます。 BeanUtilsを使用すると、String-valuedキーを使用してマップ内の個々の値を更新できます。

マップされたプロパティの値を変更するコードの例を次に示します。

Student student = new Student();
String studentName = "Joe";
student.setName(studentName);

PropertyUtils.setMappedProperty(course, "enrolledStudent(ST-1)", student);

5. ネストされたプロパティへのアクセス

プロパティ値がオブジェクトであり、そのオブジェクト内のプロパティ値にアクセスする必要がある場合、それはネストされたプロパティにアクセスすることになります。 PropertyUtilsを使用すると、modify nested propertiesにもアクセスできます。

Courseオブジェクトを介してStudentクラスのnameプロパティにアクセスするとします。 私たちは書くかもしれません:

String name = course.getEnrolledStudent("ST-1").getName();

getNestedPropertyを使用してネストされたプロパティ値にアクセスし、PropertyUtilssetNestedPropertyメソッドを使用してネストされたプロパティを変更できます。 これがコードです:

Student student = new Student();
String studentName = "Joe";
student.setName(studentName);

String nameValue
  = (String) PropertyUtils.getNestedProperty(
  course, "enrolledStudent(ST-1).name");

6. Beanプロパティのコピー

あるオブジェクトのプロパティを別のオブジェクトにコピーすることは、開発者にとって面倒でエラーが発生しやすいことがよくあります。 BeanUtils class provides a copyProperties method that copies the properties of source object to target objectここで、プロパティ名は両方のオブジェクトで同じです。

上記で作成したCourseとして、同じプロパティを持つ別のBeanクラスを作成しましょう。ただし、enrolledStudentプロパティはなく、プロパティ名はstudentsになります。 そのクラスにCourseEntityという名前を付けましょう。 クラスは次のようになります。

public class CourseEntity {
    private String name;
    private List codes;
    private Map students = new HashMap<>();

    //  standard getters/setters
}

次に、CourseオブジェクトのプロパティをCourseEntityオブジェクトにコピーします。

Course course = new Course();
course.setName("Computer Science");
course.setCodes(Arrays.asList("CS"));
course.setEnrolledStudent("ST-1", new Student());

CourseEntity courseEntity = new CourseEntity();
BeanUtils.copyProperties(courseEntity, course);

これにより、同じ名前のプロパティのみがコピーされることに注意してください。 したがって、CourseEntityクラスに同じ名前のプロパティがないため、CourseクラスのプロパティenrolledStudentはコピーされません。

7. 結論

この簡単な記事では、BeanUtilsによって提供されるユーティリティクラスについて説明しました。 また、さまざまな種類のプロパティと、それらの値にアクセスして変更する方法についても検討しました。

最後に、ネストされたプロパティ値にアクセスし、あるオブジェクトのプロパティを別のオブジェクトにコピーする方法を検討しました。

もちろん、Java SDKのリフレクションおよびイントロスペクション機能を使用してプロパティに動的にアクセスすることもできますが、学習するのが難しく、定型的なコードが必要になる場合があります。 BeanUtilsを使用すると、1回のメソッド呼び出しでこれらの値にアクセスして変更できます。

コードスニペットはover on GitHubにあります。