JavaのClassオブジェクトを利用して、private宣言されたメンバー変数の値を列挙するメソッドを作ります。
lombokの@ToStringアノテーションのようなイメージです
なぜすでにあるものを作るのか?
lombokで準備されているならlombok使えばいいじゃない?となりますが、自作する理由はいかになります
・今従事しているプロジェクトで、ライブラリの導入がめんどくさそう(管理面で)
・純粋にJava勉強のため
lombokが利用できるなら、lombokを利用するのが良いと思います
実現方法
具体的なソースはGitHubを参照してください
以降はポイントになる点を記載します
プログラム全文
package org.example;
import java.lang.reflect.Field;
import java.util.Optional;
public class Util {
public static String myToString(Object obj) {
StringBuilder sb = new StringBuilder();
try {
StringBuilder innerSb = new StringBuilder();
for(Field a : obj.getClass().getDeclaredFields()){ ・・・①
Field field = obj.getClass().getDeclaredField(a.getName());
field.setAccessible(true); ・・・②
innerSb.append(a.getName()).append(" = ").append(field.get(obj)).append(","); ・・・③
}
String str = Optional.ofNullable(innerSb.toString())
.filter(s -> s.length() != 0)
.map(s -> s.substring(0, s.length() - 1))
.orElse(""); ・・・④
sb.append(obj.getClass().getName()).append("(");
sb.append(str);
sb.append(")");
} catch(Exception e) {
System.out.println(e.getMessage());
}
return sb.toString();
}
}
①・・・Classオブジェクトの「getDeclaredFields」を利用してメンバー変数名一覧を取得しループします
②・・・「field.setAccessible(true)」でprivateメソッドにアクセスできるように設定します
③・・・「field.get(obj)」を利用して変数の値を出力します
④・・・ログ出力時に付与される余計なカンマを削除する処理です。他ライブラリに依存するのが何となく嫌だったので、このような処理になっています
変数の中身を列挙したいオブジェクトをこの変数に引数として渡してやれば、変数を列挙した文字列を返却します。
以上
自家製のToString処理の紹介でした。このメソッドの利点はJava標準ライブラリのみ利用しているので導入が簡単な点でしょうか?
Javaは長年使ってきたと思っていましたが、まだまだ知らないことも多く新しい発見がある言語です。
リリースサイクルも早まっていますので、進化についていけるかちょっと心配ですね・・・
created by Rinker
¥4,400
(2024/10/27 18:10:37時点 楽天市場調べ-詳細)
created by Rinker
¥2,860
(2024/10/27 18:10:37時点 楽天市場調べ-詳細)