0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

クラスにアクセスする

0
Posted at

ごり押し

クラスの変数を取得したければ○○.class.getDeclaredFields()
Fieldクラスの配列として取得できます

メソッド取得したければ○○.class.getDeclaredMethods()
Methodクラスの配列として取得できます

名前取得するくらいならExceptionにもならないのでぜひ覚えておきたいところ
汎用性につながりそうですね

外部でメソッドinvokeは怖いので非推奨

クラスにアクセス.java
	/**
	 * 指定されたクラス内の、指定された変数を取得し、その変数のクラス内のメンバ変数を全件取得する.
	 * 
	 * <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());
				// リストにして返却
	}

アノテーションを持つものを取得とかもできる

なんならアノテーション文字列を取得とかもできたりする

.java
	/**
	 * 指定された変数名を取得する.
	 * 
	 * <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="と、しっかり空白詰まってたりします
細かいことは実際に実行してログで確認してください

.java
		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生成できるメソッド作れます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?