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