Apache CommonsのBeanUtils

1概要

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

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

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

2 Mavenの依存関係

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

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22commons-beanutils%22%20AND%20a%3A%22commons-beanutils%22[ここ]にあります。

3 Java Beanを作成する

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

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

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

   // standard getters/setters
}

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

4物件へのアクセス

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

4.1. 簡易物件

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

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

これは、プロパティを設定するためのコード例です。

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

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

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

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

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

これは、インデックス付きプロパティを変更するコード例です。

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

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

基本型として java.util.Map を持つプロパティはすべてマッププロパティと呼ばれます。 BeanUtilsを使用すると、 String-value キーを使用してマップ内の個々の値を更新できます。

これは、マップされたプロパティの値を変更するためのコード例です。

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

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

5入れ子になったプロパティへのアクセス

プロパティ値がオブジェクトで、そのオブジェクト内のプロパティ値にアクセスする必要がある場合 - それはネストしたプロパティにアクセスすることになります。

PropertyUtils では、ネストされたプロパティにアクセスして** 変更することもできます。

Course オブジェクトを通して Student クラスのnameプロパティにアクセスしたいとします。書くかもしれない:

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

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

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

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

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

あるオブジェクトのプロパティを別のオブジェクトにコピーすることは、多くの場合、面倒であり、開発者にとって間違いが起こりやすいものです。 BeanUtils クラスは、ソースオブジェクトのプロパティをターゲットオブジェクト にコピーする copyProperties メソッドを提供します。ここで、プロパティ名は両方のオブジェクトで同じです。

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

クラスは次のようになります。

public class CourseEntity {
    private String name;
    private List<String> codes;
    private Map<String, Student> 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(course, courseEntity);

これは同じ名前のプロパティのみをコピーすることを忘れないでください。

したがって、 CourseEntity クラスに同じ名前のプロパティがないため、 Course クラスのプロパティ enrolledStudent はコピーされません。

7. 結論

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

最後に、ネストしたプロパティ値へのアクセスと、あるオブジェクトのプロパティを別のオブジェクトにコピーする方法について調べました。

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

コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[over on GitHub]にあります。