JavaBeansのgetterを動的に呼び出したい

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
Classパラメータについて

JavaのクラスはすべてgetClass()というメソッドをもっています。
これはObjectクラスで定義されているものです。
今回はgetから始まるメソッドをすべて実行しているので実行されていますが、必要のない場合はifで表示処理をしないようにすれば表示されません。

Object (Java Platform SE 8)

まとめ

どうでしょうか、思ったより簡単にgetから始まるメソッドを動的にすべて実行することができました。

結構使える場面は多いと思うので、簡単に実装できるということを覚えておくだけでどこかで役に立つのではないでしょうか?

コメント

タイトルとURLをコピーしました