2011-11-29 9 views
8

エンティティに含まれるフィールド/値のハッシュマップを作成する必要があります。そのため、フィールド名を持つタグを含む文字列に置き換えることができます。フィールド/値ハッシュマップを作成するJavaのリフレクション

私はこのコードを持っている:

public static String replaceTags(String message, Map<String, String> tags) ... 

タグに同等の値についてメッセージで見つかったすべてのタグを置き換えますが、マップテーブルを構築するために私は「どんな取る必要があります"エンティティとエンティティからマップを作成することができます。だから、どうすればそれを可能にすることができますか?エンティティを送信し、すべてのフィールドと値を持つMapを返します。

public static Map<String, String> getMapFromEntity(Object entity){ 
    Map<String, String> map = new HashMap<String, String>(); 

    ...????? 

    return map; 
} 

私はリフレクションを使用することができます知っていて、これは私がこれを成し遂げるために発見した唯一のアプローチですが、私は、より効率的な方法を意味する?同じことを達成するために他の方法があります。

ありがとうございました。

+0

入力文字列にどのタグが存在する可能性があるのか​​わからない場合は、反射がAFAIKの唯一の方法になります。 – aishwarya

+0

はい@aishwarya、エンティティにはあらゆる種類のデータを含めることができるので、リフレクションは唯一の方法です。ありがとうございます。 –

+0

Dup of http://stackoverflow.com/questions/6796187/java-introspection-object-to-map – Vadzim

答えて

9
Field[] fields = entity.getClass().getFields(); 
    Map<String, String> map = new HashMap<String, String>(); 
    for(Field f : fields) 
      map.put(f.getName(),(String) f.get(entity)); 

などです。エンティティはクラス自体ではなく、クラスのオブジェクトである必要があります。 あなたのフィールドがプライベートであり、あなたは彼らのためにゲッターを持っている場合、あなたは(getMethodsを使用する必要があります)とメソッド名が「取得」で始まるかどうかを確認prefix.Likeこの:

Method[] methods = entity.getClass().getMethods(); 
    Map<String, String> map = new HashMap<String, String>(); 
    for(Method m : methods) 
    { 
     if(m.getName().startsWith("get")) 
     { 
      String value = (String) m.invoke(entity); 
      map.put(m.getName().substring(3), value); 
     } 
    } 
+0

こんにちはAdemiban、コードのおかげで、非常にうまくいきました!さらに、返された値の一部をキャストしなければならないと思っていましたそれらのメソッドのすべてがストリングではないのでメソッドによって、しかしこれはあなたがメインコードを持っていれば簡単です。 –

+4

ブール値のゲッターは "is"で始まるかもしれません;-)。 trueにアクセス可能に設定した直後にフィールドから値を取得するほうが簡単ですが、メソッドも実行できます。 – aishwarya

0

私はリフレクションを使用することができます知っていて、これは私が これを行うために見つけた唯一のアプローチですが、 同じを達成するための他の方法はありますか?あなたには、いくつかのインターフェイスを実装し、マップを抽出あなたのコードは、このインターフェイスを認識しているからマップを構築したいクラス(複数可)しない限り、

は、私の知る限りでは、反射は、これを実現する唯一の方法です。

関連する問題