2016-07-05 8 views
1

これはむしろ奇妙なことですが、自己メソッドを呼びたいと思います。Javaの自己反映

私の目標は、列のすべてのフィールドを通してAbstractMapperコンストラクタ繰り返し処理、およびそのそれぞれのセッターのすべてを呼び出すことで、これは私の抽象クラス

public abstract class AbstractMapper { 
    public AbstractMapper(Map<String, String> map) { 
     Field[] fields = this.getClass().getDeclaredFields(); 
     for (Field field: fields) { 
      if (field.getAnnotation(Column.class) != null) { 
       String fName = field.getName(); 
       String rsName = field.getAnnotation(Column.class).name(); 
       StringBuilder sb = new StringBuilder("set") 
         .append(Character.toUpperCase(fName.charAt(0))) 
         .append(fName.substring(1)); 
       String mName = sb.toString(); 

//    this.invoke(mName, map.get(fName)); <-- What should I put this here? 
      } 
     } 
    } 
    public Result getCalculatedValues() { 
     return xxxx; 
    } 
} 

であり、これは今、私のクラス

public class NewMachine extends AbstractMapper{ 
    @column(name = machine) 
    private String machine; 

    @column(name = temperature) 
    private Double temperature; 

    // normal get/set methods 

} 

です。

この場合には、私が

Map<String, String> map = SomeClass.SomeMethod(); 
NewMachine m = new NewMachine(map); 
Result r = m.getCalculatedValues(); 

のようなものを渡すことができますご協力いただきありがとうございます。

+3

なぜこれをやりたいですか? – aksappy

+0

ああ..何も特別なものではありません。どのようにコード化するか、どのように動作するか、どのくらい高速であるかを見たいだけです。 – Magician

答えて

0

getClass().getMethod(mName, field.getType()).invoke(this, map.get(fName))を試してください(そしてcの考えられる例外を処理してください)。

さらに心にgetDeclaredFields()にJavadocを保つ:

このオブジェクトが表すクラスまたはインタフェースによって宣言されたすべてのフィールドを反映{@codeフィールド}オブジェクトの配列を返します。これには、公開、保護、デフォルト(パッケージ)アクセス、およびプライベートフィールドが含まれますが、は継承されたフィールドを除きます

階層がある場合は、スーパークラスのフィールドも取得する必要があります。

+0

ありがとうございます。 – Magician

関連する問題