使用反射然后编辑运行时变量加载类(Load a class using reflection the

2019-07-30 07:29发布

好了,所以我有它加载另一个类的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? 另外,如果我想只调用一个方法,并没有得到一个价值是什么? 或者,如果我想补充我自己的方法/代码?

Answer 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));
      }
    //}

  }
}


文章来源: Load a class using reflection then edit the variables during runtime