У меня есть модель модели, в которой значения помечены аннотацией BIND.Аннотация должна позволять:
присваивать значения входным переменным модели перед выполнением расчетов
загружать значения переменных, рассчитанные в модели(после проведения расчетов).
Я считываю данные из файла и с помощью отражения передаю их значения переменным в классе модели.Моя проблема в том, что аннотация ничего не меняет.У меня неверные результаты вычислений.
import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bind {
}
public class Model1 {
@Bind private int LL;
@Bind private double[] twKI;
@Bind private double[] twKS;
@Bind private double[] twINW;
@Bind private double[] twEKS;
@Bind private double[] twIMP;
@Bind private double[] KI;
@Bind private double[] KS;
@Bind private double[] INW;
@Bind private double[] EKS;
@Bind private double[] IMP;
@Bind private double[] PKB;
public Model1() {}
public void run() {
PKB = new double[LL];
PKB[0] = KI[0] + KS[0] + INW[0] + EKS[0] - IMP[0];
for (int t=1; t < LL; t++) {
KI[t] = twKI[t]* KI[t-1];
KS[t] = twKS[t]* KS[t-1];
INW[t] = twINW[t]* INW[t-1];
EKS[t] = twEKS[t]* EKS[t-1];
IMP[t] = twIMP[t]* IMP[t-1];
PKB[t] = KI[t] + KS[t] + INW[t] + EKS[t] - IMP[t];
}
}
}
Так что он дает значение в классе мода из другого класса
Field fieldLL = class1.getDeclaredField("LL");
fieldLL.setAccessible(true);
fieldLL.setInt(modelName, LL);
Field fieldtkWI = class1.getDeclaredField("twKI");
fieldtkWI.setAccessible(true);
fieldtkWI.set(modelName, twKI);
Field fieldtwKS = class1.getDeclaredField("twKS");
fieldtwKS.setAccessible(true);
fieldtwKS.set(modelName, twKS);
и т. Д.
И вызывает метод run
Method method = class1.getDeclaredMethod("run");
method.invoke(modelName);
Field fieldPKB = class1.getDeclaredField("PKB");
fieldPKB.setAccessible(true);
PKB = (double[]) fieldPKB.get(modelName);
И, например, значение pf pkb из моего кода:
PKB 1714273.4 1893950.2719999999 2115659.0986
2362962.8638815996 2638886.923654132
И оно должно быть
PKB 1714273.4 1815516.032 1944672.4554000003
2083203.6166496002 2231733.528866293
Только первое правильное значение