Динамическое отражение объекта инициализации элементов списка не меняет исходный объект - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь динамически инициализировать объекты списка с помощью Java-отражения, но после этого исходные объекты все еще сохраняют исходные значения, и связь между исходными объектами и соответствующим элементом списка прерывается.

Вот фрагмент кода для лучшего понимания моей проблемы:

public class TimeModule {
    int value;

    public TimeModule() {
        this.value = 1;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    public String print() {
        return "value: " + this.value;
    }
}


public class TimeModuleExtended1 extends TimeModule {

    double foo;

    public TimeModuleExtended1() {
        super();
        this.foo = 1.0;
    }

    public void setFoo(double foo) {
        this.foo = foo;
    }

    public double getFoo() {
        return this.foo;
    }

    @Override
    public String print() {
        return "value: " + this.value + ", foo:" + this.foo; 
    }
}


public class TimeModuleExtended2 extends TimeModule {

    double bar;

    public TimeModuleExtended2() {
        super();
        this.bar = 1.0;
    }

    public void setBar(double bar) {
        this.bar = bar;
    }

    public double getBar() {
        return this.bar;
    }

    @Override
    public String print() {
        return "value: " + this.value + ", bar:" + this.bar; 
    }
}

А вот основной код: import java.util.ArrayList;import java.util.List;

public class Test {

    public static void main(String[] args) {
        TimeModuleExtended1 t1 = new TimeModuleExtended1();
        t1.setValue(2);
        t1.setFoo(2.0);
        System.out.println("Initial Values:");
        System.out.println(t1.print());

        TimeModuleExtended2 t2 = new TimeModuleExtended2();
        t2.setValue(3);
        t2.setBar(3.0);
        System.out.println(t2.print());

        List<TimeModule> modules = new ArrayList<>();
        modules.add(t1);
        modules.add(t2);

        // reinitialize Time Base modules
        for (int i = 0; i < modules.size(); i++) {
            TimeModule m = modules.get(i);
            try {
                modules.set(i, (TimeModule) m.getClass().getConstructors()[0].newInstance());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        System.out.println("\nList Values: ");
        for (int i = 0; i < modules.size(); i++) {
            System.out.println(modules.get(i).print());
        }

        System.out.println("\nObject Values: ");
        System.out.println(t1.print());
        System.out.println(t2.print());        
    }
}

Вывод выглядит следующим образом:

Initial Values:
value: 2, foo:2.0
value: 3, bar:3.0

List Values: 
value: 1, foo:1.0
value: 1, bar:1.0

Object Values: 
value: 2, foo:2.0
value: 3, bar:3.0

Как видно, значения списка не равны значениям объекта;как заставить их иметь похожие значения?

...