Java自我反思

时间:2016-07-05 07:14:13

标签: java reflection

这很奇怪,但我想称之为自我方法。

这是我的抽象类

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构造函数使用列遍历所有字段,并调用其所有相应的setter。

在这种情况下,我可以传递类似

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尝试getClass().getMethod( mName, field.getType() ).invoke(this, map.get(fName) )(并处理任何可能的例外情况)。

另外,请牢记JavaDoc getDeclaredFields()

  

返回{@code Field}对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。这包括公共,受保护,默认(包)访问和私有字段,但排除了继承的字段

如果你有一个层次结构,你也必须得到超类的字段。