2016-07-05 60 views
1

這很奇怪,但我想打電話給自己的方法。Java自我反思

這是我的抽象類

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 

} 

現在,我的目標是,AbstractMapper構造遍歷與列的所有領域,並調用它的所有相應的制定者。

在這種情況下

,我可以通過類似

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))(並處理任何可能的例外ofc)。

另外保持的JavaDoc上getDeclaredFields()記:

返回的數組{@code領域}對象反映此Class對象所表示的類或接口聲明的所有字段。這包括公共,受保護,默認(包)訪問和專用字段,但不包括繼承字段

如果你有一個層次結構,你也必須得到超類的字段。

+0

謝謝你。 – Magician