Вопрос по runtime, reflection, java, class, variables – Загрузите класс, используя отражение, затем отредактируйте переменные во время выполнения

0

Итак, у меня есть файл Java, который загружает другой класс, и я хочу, чтобы файл Java мог редактировать и читать переменные из класса, который работает.

Например:    У меня есть кнопка, которая при нажатии устанавливает переменную (это файл класса). Я хочу, чтобы файл Java, который загружает этот класс, мог видеть новое значение переменной, читать его, устанавливать его и делать все, что нужно. И я хочу новое значение, которое будет отображаться в работающем классе Java.

Это то, что я пробовал до сих пор, но когда я пытаюсь отредактировать значения, такие как получение baseX, он не отображается в рабочем классе. Кроме того, значение baseX должно измениться, когда я выполняю какие-либо действия в классе выполнения, но эти вещи не выводятся на экран, когда я их изменяю. Это как если бы отражение не могло читать вещи во время выполнения. Так что же?

Class c = Class.forName("Client");
        for (Method m : c.getMethods()) {
            if (m.getName().contentEquals("main")) {
                Object[] passedArgs = { args };
                m.invoke(null, passedArgs);
            }

        }
        Object instance = c.newInstance();

        Field baseX = c.getField("baseX");
        Field loggedIn = c.getField("loggedIn");

        boolean gotValues = false;
        while(!gotValues) {
            boolean loggedin = loggedIn.getBoolean(instance);
            if(loggedin) {
                System.out.println(baseX.get(instance));
            } else {
                System.out.println(loggedin);
                loggedIn.setBoolean(instance, true);
            }
        }

Также да, методы getter / setter будут работать, если они будут работать во время выполнения, и я мог бы сделать так, чтобы при нажатии кнопки x на экране изменялась переменная y. Что такое боб Java? И что, если я хочу просто вызвать метод, а не получить значение? Или что, если я хочу добавить свои собственные методы / код?

Отредактировал мои вещи. Ryan Glen
Что вы пробовали и где ваша проблема? Вы только что заявили, чего хотите достичь. Jochen
Похоже, вы хотите написать Java-бин с некоторыми методами получения и установки :) paulsm4

Ваш Ответ

1   ответ
0

Попробуй это:

public class Client {
  public Object baseX = new Object();
  public boolean loggedIn;
}
-----
public class Main {
  public static void main(String[] args) throws Exception {
    Class c = Class.forName("Client");
    /*for (Method m : c.getMethods()) {
      if (m.getName().contentEquals("main")) {
        Object[] passedArgs = {args};
        m.invoke(null, passedArgs);
      }

    }*/
    Object instance = c.newInstance();

    Field baseX = c.getField("baseX");
    Field loggedIn = c.getField("loggedIn");

    boolean gotValues = false;
    //while (!gotValues) {
      boolean loggedin = loggedIn.getBoolean(instance);
      if (loggedin) {
        System.out.println("Logged in!");
        System.out.println(baseX.get(instance));
      }
      else {
        System.out.println("NOT Logged in!");
        System.out.println(loggedin);
        loggedIn.setBoolean(instance, true);
        System.out.println(loggedIn.getBoolean(instance));
      }
    //}

  }
}
По сути, у меня так и есть, когда я нажимаю на кнопку «Войти» и захожу в игру, она регистрирует меня, но когда я пытаюсь использовать отражение для проверки логического значения loggedIn, оно по-прежнему говорит, что я не вошел в систему, даже если я в нем. Это так, как будто он не читает программу, которую я запускаю. Ryan Glen
Guy! Вы не устанавливаете значение в "gotValues". Другая проблема, с которой вы могли бы столкнуться - проверить, запускаете ли вы свою программу из одного потока. И еще одна вещь: используйте отладчик!

Похожие вопросы