web-dev-qa-db-ja.com

Javaプロパティ名でプロパティ値を取得

Javaでクラスのプロパティ値を名前で取得することは可能ですか?)たとえば、私は次のようなクラスを持っています

public class Test {
    private String field;
    public String getField() {...}
    public void setField() {...}
}

とマップを持つ別のクラス

public class Main {
    private static final Map<String, Long> map = new HashMap<String, Long>();
    static {
        map.put("field", new Long(1));
    }
    public void doSth() {
    Set<String> keys = map.keySet();
    Test t = new Test();
    for (String key : keys) {
    //t.getPropertyValueByName(key); ?
    }
    }
16
kassie

プロパティベースのアクセスを提供するライブラリの一部を使用できます。私は最もよく知られ使用されていると思います beanutils 。 「動作中」のbeanutils here の良い例が1つあります。いくつかのサンプルコード:

A someBean = new A();

// access properties as Map
Map<String, Object> properties = BeanUtils.describe(someBean);
properties.set("name","Fred");
BeanUtils.populate(someBean, properties);

// access individual properties
String oldname = BeanUtils.getProperty(someBean,"name");
BeanUtils.setProperty(someBean,"name","Barny"); 
15
Dan94

はい。コメントアウトされた行をt.getClass()。getField(map.get(key))。get(t)に置き換えることができます。これは、tのフィールドの値を取得します。

6
bjc2406

の他に
String org.Apache.commons.beanutils.BeanUtils.getProperty(object, propertyName)
有る
Object org.Apache.commons.beanutils.PropertyUtils#getProperty(object, propertyName)
これは値を文字列に変換しません。

これは、整数型、10進数型、ブール型を保持するのに役立ちます。

1
fyrkov

問題のフィールドにアクセスできる限り、bjc2406の回答は問題なく機能します。

t.getClass()。getField(map.get(key))。get(t)

合理的に公開できない場合は、リフレクションおよびその他のフィールドアクセスAPIで作業を完了する必要があります。 Javaでプライベートフィールドを読み取る方法

1
Danny Salvadori

問題は、プロパティがどのくらいの頻度で変化するかです。定数はありますか、それとも状況に依存しますか?

後者の場合は、多くの場合、外部ファイルのプロパティが必要です。標準Javaプロパティapiはそのために最適です: http://docs.Oracle.com/javase/7/docs/api/Java/util/Properties.html =。

Springのようなフレームワークを使用する場合、プロパティを処理する標準的な方法も付属します。ドキュメントをご覧ください。

0