1. ホーム
  2. java

[解決済み] リフレクションによるゲッターの最適な起動方法

2022-05-17 16:32:56

質問

私は特定のアノテーションを持つフィールドの値を取得する必要があります。そこでリフレクションを使って、私はこのフィールドオブジェクトを取得することができます。問題は、私はそれが常にゲッターメソッドを持っていることを事前に知っているが、このフィールドは常にプライベートであることです。私はそのゲッターメソッドを呼び出すことを好むが、私は(PermissionManagerがない場合)setAccesible(true)を使用して、その値を得ることができることを知っている。

私は、"get+fieldName"を探すことによってメソッドを探すことができることを知っています(しかし、例えばbooleanフィールドは時々"is+fieldName"として名付けられるのを知っています)。

このゲッターを呼び出すより良い方法があるかどうか疑問に思います(多くのフレームワークは属性にアクセスするためにゲッター/セッターを使用するので、たぶん別の方法で行うのでしょう)。

ありがとうございます。

どのように解決するのですか?

正しい方向性を示してくれるはずです。

import java.beans.*

for (PropertyDescriptor pd : Introspector.getBeanInfo(Foo.class).getPropertyDescriptors()) {
  if (pd.getReadMethod() != null && !"class".equals(pd.getName()))
    System.out.println(pd.getReadMethod().invoke(foo));
}

BeanInfoまたはPropertyDescriptorインスタンスを自分で、つまりIntrospectorを使わずに作成できることに注意してください。しかし、Introspectorは、通常Good Thing (tm)であるいくつかのキャッシュを内部で行っています。キャッシュがなくてもいいのであれば、さらに

// TODO check for non-existing readMethod
Object value = new PropertyDescriptor("name", Person.class).getReadMethod().invoke(person);

しかし、java.beanのAPIを拡張し簡略化したライブラリはたくさんあります。Commons BeanUtilsはよく知られた例です。そこでは、単純に

Object value = PropertyUtils.getProperty(person, "name");

BeanUtilsには他にも便利なものがあります。例えば、ユーザー入力からプロパティの設定を簡単にするためのオンザフライの値変換(オブジェクトから文字列、文字列からオブジェクト)です。