Java Android, л oop через все геттеры - PullRequest
1 голос
/ 24 апреля 2020

У меня есть модель, как показано ниже:

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;
    }
}

Я вызываю эту модель в адаптере рециркуляции для обновления пользовательского интерфейса, а на 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()));

В действительности у этой модели много геттеров и сеттеров, и я пытался провести через них oop, чтобы я мог сделать что-то вроде этого:

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 отражение или какой-либо метод l oop через все геттеры модели и затем вызвать их?

Просматривая SO, я нашел некоторые ответы, но безуспешно для вызова геттеров.

Ответы [ 3 ]

3 голосов
/ 24 апреля 2020

Другие ответы, особенно Магнус, определенно сделали свою работу. Это правильные ответы. Единственное отличие этого решения от других заключается в том, что это гарантирует, что имя метода начинается с getH, что выглядит как шаблон. Он также проверяет, имеет ли тип возвращаемого значения тип double, чтобы гарантировать, что возвращается правильный метод.

        Shifts shifts = new Shifts(1, 2, 3, 4);

        Method[] methods = shifts.getClass().getDeclaredMethods();

        for (Method method : methods) {
            if (method.getName().startsWith("getH") && method.getReturnType() == double.class) {
                double value = (double) method.invoke(shifts);
            }
        }
3 голосов
/ 24 апреля 2020

Этот код перебирает все методы класса obj, и если имя метода начинается с 'get', он вызывает метод m в экземпляре obj и присваивает результат объекту:

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
    }
}
1 голос
/ 24 апреля 2020

Да, есть способ, которым вы можете пройти через геттеры через отражения. Сначала вы должны составить какой-то список с именами атрибутов. Я сделал это один раз с HashMap и сеттерами, затем я перебрал эту карту ha sh с:

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 является параметром сеттера, поэтому я полагаю, вам не нужна эта часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...