【问题标题】:Load a class using reflection then edit the variables during runtime使用反射加载一个类,然后在运行时编辑变量
【发布时间】:2012-07-08 23:13:26
【问题描述】:

好的,所以我有一个 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 Bean?另外,如果我只想调用一个方法而不获取值怎么办?或者如果我想添加自己的方法/代码怎么办?

【问题讨论】:

  • 您尝试了什么,您的问题在哪里?到目前为止,您已经说明了您想要实现的目标。
  • 听起来你想用一些 getter 和 setter 方法编写一个 Java bean :)

标签: java class variables reflection runtime


【解决方案1】:

试试这个:

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布尔值时它仍然说我没有登录,即使我是。就好像它没有读取正在运行的程序一样。
  • 伙计!您没有将值设置为“gotValues”。您可能要检查的另一个问题是您是否从单线程内运行程序。还有一件事:使用调试器!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多