ごり押し
クラスの変数を取得したければ○○.class.getDeclaredFields()
Fieldクラスの配列として取得できます
メソッド取得したければ○○.class.getDeclaredMethods()
Methodクラスの配列として取得できます
名前取得するくらいならExceptionにもならないのでぜひ覚えておきたいところ
汎用性につながりそうですね
外部でメソッドinvokeは怖いので非推奨
/**
* 指定されたクラス内の、指定された変数を取得し、その変数のクラス内のメンバ変数を全件取得する.
*
* <pre>
* たとえば.
*
* MyModelクラスの中に
*
* private MyModel2 model;
* private String str;
*
* とあり、
* MyModelクラスの中に
*
* private String id;
* private String name;
*
* とあった場合に
*
* idとnameの文字列を取得する
* </pre>
*
* @param clazz 指定クラス
* @param fieldName 全メンバを取得したい型の変数
*/
public static List<String> get2(Class<? extends Object> clazz, String fieldName) {
return Stream.of(clazz.getDeclaredFields())
// ↑クラス内の全メンバ変数を取得(modelとstr)
.filter(v -> fieldName.equals(v.getName()))
// ↑指定された変数と一致するメンバ変数に絞る(MyModel2型のmodelになる)
.map(Field::getType)
// ↑その変数の型クラスに変換(MyModel2クラスになる)
.map(Class::getDeclaredFields)
// ↑クラス内の全メンバ変数を取得(idとname) 配列です
.map(Arrays::asList)
// ↑配列をリストに
.flatMap(Collection::stream)
// リストならして、streamに
.map(Field::getName)
// 変数名に変換(idとnameという文字列になる)
.collect(Collectors.toList());
// リストにして返却
}
アノテーションを持つものを取得とかもできる
なんならアノテーション文字列を取得とかもできたりする
/**
* 指定された変数名を取得する.
*
* <pre>
* 例えば
* MyModelっていうクラスの中で
* 「@Id」 アノテーションを持っている変数が欲しいなら
* get(MyModel.class, Id.class)として使う
* </pre>
*
* @param clazz 検索対象のクラス
* @param annotation 指定アノテーションクラス
*/
public static List<String> get(Class<? extends Object> clazz, Class<? extends Annotation> annotation) {
return Stream.of(clazz.getDeclaredFields())
// ↑クラスの持つメンバ変数を取得
.filter(v -> Stream.of(v.getAnnotations())
// ↑メンバ変数に付与されているアノテーション一覧を取得
.map(Annotation::annotationType)
// ↑アノテーションクラスに変換
.anyMatch(annotation::equals))
// ↑引数で指定されたアノテーションクラスと一致するものに絞る
.map(Field::getName)
// ↑その変数名を取得
.collect(Collectors.toList());
}
アノテーション文字列取得
@Column(name = "annotation", value = "aaaa")
とかの文字列そのものを取得できます
実際に読み込まれるときは
@Column(name="annotation", value="aaaa")
というようにname="と、しっかり空白詰まってたりします
細かいことは実際に実行してログで確認してください
List<String> annotation = Stream.of(引数.class.getDeclaredMethods())
.map(Method::getAnnotations)
.map(Arrays::asList)
.flatMap(Collection::stream)
.map(Annotation::toString)
.collect(Collectors.toList());
何に使えるか
クラス名や変数名が欲しくなる時すなわち
entity名やカラム名
そう、SQL生成できそうですね
キャメルケース、スネークケース変換や
上手いこと正規表現を使いまくって
汎用的にSQL生成できるメソッド作れます