Javaでプログラムを書いているとJavaBeansのgetterをすべて呼び出したいことってありませんか?
私はサーブレットを書いていて良くそんなことを思います。
例えば、JavaBeansのオブジェクトをjsonに変換したい時なんかに。
リフレクションを使用する
今回はJavaの標準APIで実装されているリフレクションAPIというものを使用していきます。
StudentBeanというクラスのgetメソッドすべて実行するコードは以下のようになります。
import java.util.Date;
import java.util.Scanner;
import java.util.Set;
import java.lang.reflect.Method;
public class Main{
//objに含まれるgetから始まるメソッドを実行
private static void showAllParams(Object obj) {
Method[] methods = obj.getClass().getMethods();
for(Method m : methods) {
if(m.getName().startsWith("get")){
System.out.print(m.getName().replaceFirst("get", "") + " : ");
try {
System.out.println(m.invoke(obj));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
StudentBean sb = new StudentBean();
sb.setName("nonnbiri");
sb.setAge(10);
sb.setBirthday(new Date());//現在の日時をセットする
showAllParams(sb);
}
}
使用したStudentBeanこんな感じです。
import java.util.Date;
import java.io.Serializable;
class StudentBean implements Serializable {
private String name;
private int age;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
実行結果は以下のようになります。正しく表示されていることが分かるかと思います。
Birthday : Wed May 15 22:45:56 JST 2024
Age : 10
Name : nonnbiri
Class : class StudentBeand
まとめ
どうでしょうか、思ったより簡単にgetから始まるメソッドを動的にすべて実行することができました。
結構使える場面は多いと思うので、簡単に実装できるということを覚えておくだけでどこかで役に立つのではないでしょうか?
コメント