2016-07-05 62 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