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]にあります。