javaandroid,遍历所有getter

javaandroid,遍历所有getter,java,android,Java,Android,我有一个模型如下: public class Shifts{ private double h00; private double h01; private double h02; private double h03; public Shifts() { } public Shifts(double h00, double h01, double h02, double h03) { this.h00 = h00;

我有一个模型如下:

public class Shifts{

    private double h00;
    private double h01;
    private double h02;
    private double h03;

    public Shifts() {
    }

    public Shifts(double h00, double h01, double h02, double h03) {
        this.h00 = h00;
        this.h01 = h01;
        this.h02 = h02;
        this.h03 = h03;
    }

    public double getH00() {
        return h00;
    }

    public void setH00(double h00) {
        this.h00 = h00;
    }

    public double getH01() {
        return h01;
    }

    public void setH01(double h01) {
        this.h01 = h01;
    }

    public double getH02() {
        return h02;
    }

    public void setH02(double h02) {
        this.h02 = h02;
    }

    public double getH03() {
        return h03;
    }

    public void setH03(double h03) {
        this.h03 = h03;
    }
}
我在循环适配器中调用此模型以更新UI,在onBindViewHolder上,我如下所示:

holder.h00.setText(fooList.get(position).getH00()));
holder.h01.setText(fooList.get(position).getH01()));
holder.h02.setText(fooList.get(position).getH02()));
holder.h03.setText(fooList.get(position).getH03()));
for (int i = 0; i < holder.shift_layout.getChildCount(); i++) {
                //shift_layout is the Layout which holds all the views
                View v = holder.shift_layout.getChildAt(i);
                if (v instanceof TextView) {

                    v.setText(Hour(fooList.get(position).getGetter()));
                }
            }
实际上,这个模型有很多getter和setter,我试着循环使用它们,这样我就可以这样做:

holder.h00.setText(fooList.get(position).getH00()));
holder.h01.setText(fooList.get(position).getH01()));
holder.h02.setText(fooList.get(position).getH02()));
holder.h03.setText(fooList.get(position).getH03()));
for (int i = 0; i < holder.shift_layout.getChildCount(); i++) {
                //shift_layout is the Layout which holds all the views
                View v = holder.shift_layout.getChildAt(i);
                if (v instanceof TextView) {

                    v.setText(Hour(fooList.get(position).getGetter()));
                }
            }
有没有一种方法可以使用Java反射或任何方法循环遍历模型的所有getter,然后调用它们


通过查看,我找到了一些答案,但调用getter没有成功。

此代码迭代类obj的所有方法,如果方法名称以“get”开头,则调用实例obj上的方法m,并将结果分配给对象:

final Object obj;    
for (Method m : obj.getClass().getMethods())
    if (m.getName().startsWith("get") && m.getParameterTypes().length == 0) {
      final Object object = m.invoke(obj);
      // do something
    }
}

此代码迭代类obj的所有方法,如果方法名称以“get”开头,则调用实例obj上的方法m,并将结果分配给对象:

final Object obj;    
for (Method m : obj.getClass().getMethods())
    if (m.getName().startsWith("get") && m.getParameterTypes().length == 0) {
      final Object object = m.invoke(obj);
      // do something
    }
}

是的,有一种方法可以通过反射循环通过getter。您应该首先创建一个包含属性名称的列表。 我用HashMap和setter做了一次,然后用以下代码迭代了该HashMap:

for (Map.Entry<String, Integer> entry : myMap.entrySet()) {
    var setterName = "set" + entry.getKey().toUpperCase();
    Method setter = instanceOfMyClassWithSetters.getClass().getMethod(setterName, Integer.class);
    setter.invoke(instanceOfMyClassWithSetters, entry.getValue());
}

Integer.class是setter参数,所以我想您不需要该部分。

是的,有一种方法可以通过反射循环getter。您应该首先创建一个包含属性名称的列表。 我用HashMap和setter做了一次,然后用以下代码迭代了该HashMap:

for (Map.Entry<String, Integer> entry : myMap.entrySet()) {
    var setterName = "set" + entry.getKey().toUpperCase();
    Method setter = instanceOfMyClassWithSetters.getClass().getMethod(setterName, Integer.class);
    setter.invoke(instanceOfMyClassWithSetters, entry.getValue());
}

Integer.class是一个setter参数,所以我想您不需要这个部分。

提供的其他答案,尤其是Magnus,肯定完成了任务。这些都是正确的答案。此解决方案与其他解决方案之间的唯一区别在于,这将确保方法名以getH开头,getH似乎是pattern。它还检查返回类型是否为double类型,以帮助确保返回正确的方法

班次=新班次1、2、3、4; 方法[]方法=shifts.getClass.getDeclaredMethods; 方法:方法{ 如果method.getName.startsWithgetH&&method.getReturnType==double.class{ double value=double method.invokeshifts; } }
提供的其他答案,尤其是马格纳斯,肯定能完成任务。这些都是正确的答案。此解决方案与其他解决方案之间的唯一区别在于,这将确保方法名以getH开头,getH似乎是pattern。它还检查返回类型是否为double类型,以帮助确保返回正确的方法

班次=新班次1、2、3、4; 方法[]方法=shifts.getClass.getDeclaredMethods; 方法:方法{ 如果method.getName.startsWithgetH&&method.getReturnType==double.class{ double value=double method.invokeshifts; } }
创建注释处理器,定义注释,将其置于类之上并进一步处理。@silentsudo这实际上可能是一个好答案的基础。请注意,除非您有理由使用无参数构造函数,其中所有字段都设置为0.0,否则我郑重建议将其删除。如果它是一个严重的Bean错误,那么您可能需要保持它并实现可序列化。创建注释处理器,定义注释,将其置于类之上并进一步处理。@silentsudo这实际上可能是一个不错的答案的基础。请注意,除非您有理由使用无参数构造函数,其中所有字段都设置为0.0,我很认真地建议把它去掉。如果这是一个严重的问题,那么您可能需要保持它并实现可序列化。您能在回答中添加一些解释吗?我想这本书很容易阅读,但通常我们会尽量避免只使用代码的答案,所以…你能在你的答案中添加一些解释吗?我猜这一个很容易阅读,但通常我们会尽量避免只使用代码的答案,所以…注意,我相信OP需要getter,这样他们可以检索所有值,它们应该是double,而不是integer。注意,我相信OP需要getter,这样他们可以检索所有值,它们应该是double,而不是integer。非常感谢,我设法找到了解决办法。再次谢谢你,很高兴听到!非常感谢,我终于找到了解决办法。再次谢谢你,很高兴听到!