Beanのgetterだけ取得して処理を行いたい場合はIntrospectorを使用する。


タイトルの通りだが、こんなBeanがあったとする。

public class Hoge {

 private int no;
 private String cd;
 private String nm;

 public Long getNo() {
  return no;
 }
 public void setNo(Long no) {
  this.no = no;
 }

 @Hoge
 public int getCd() {
  return cd;
 }
 public void setCd(int cd) {
  this.cd = cd;
 }
 
 public String getNm() {
  return nm;
 }
 public void setNm(String nm) {
  this.nm = nm;
 }
}


んでこれをMapにしたいという要望があったんだよ(´・ω・`)
さらにBeanはこれだけでなくいろんなBeanをMapにしたいそうです(T_T)

さらに、getterにアノテーションがついていた場合、別処理をしたいそうです(^_^;)


ゲッターメソッドの配列を取るべきか等悩んでたら見っけた(*´∀`*)

java.beans.Introspector と java.beans.PropertyDescriptor を使えばうまく行った(*´ω`*)



さっそくサンプル

public class HogeUtil {

 public static Map<String, Object> getMap(Object bean) {

  Map<String, Object> map = new HashMap<>();
  for (PropertyDescriptor prop : Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors()) {
   // prop.getName() で class,no,cd,nm が取れます
   if (prop.getName().equals("class")) {
    // classはスキップ
    continue;
   }

   // ゲッターメソッドの取得
   Method method = prop.getReadMethod();
   // アノテーションチェック
   if (method.getAnnotation(Hoge.class) != null) {
    // アノテーションが設定されている
    continue;
   }
   
   // マップの設定
   map.put(prop.getName(), method.invoke(o));
  }
 return map;
 }
}


これ調べるの少し時間かかったが、面白い処理ができたな。
僕、満足(*´ω`*)☆

まん まん 満足 1本満足 ( ゚∀゚ )ハッ!

まん まん 満足 1本満足 ( ゚∀゚ )ハッ!

まん まん 満足 1本満足 ( ゚∀゚ )ハッ!

0 件のコメント:

コメントを投稿