Java 使用反射加载一个类,然后在运行时编辑变量
好的,我有一个java文件,它正在加载另一个类,我希望java文件能够编辑和读取正在运行的类中的变量 例如: 我有一个按钮,按下它可以设置一个变量(这是类文件)。我希望加载这个类的java文件能够看到变量的新值,读取它,设置它并执行任何需要的操作。我想要新的值,它被设置为显示在正在运行的java类上 这是我到目前为止尝试过的,但是当我尝试编辑诸如Get baseX之类的值时,它不会显示在正在运行的类中。此外,当我在运行的类上执行某些操作时,baseX值应该会更改,但更改时这些操作不会打印到屏幕上。这就好像反射无法在运行时读取内容一样。那么,这意味着什么呢Java 使用反射加载一个类,然后在运行时编辑变量,java,class,variables,reflection,runtime,Java,Class,Variables,Reflection,Runtime,好的,我有一个java文件,它正在加载另一个类,我希望java文件能够编辑和读取正在运行的类中的变量 例如: 我有一个按钮,按下它可以设置一个变量(这是类文件)。我希望加载这个类的java文件能够看到变量的新值,读取它,设置它并执行任何需要的操作。我想要新的值,它被设置为显示在正在运行的java类上 这是我到目前为止尝试过的,但是当我尝试编辑诸如Get 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在屏幕上改变。什么是javabean?如果我只想调用一个方法而不获取一个值呢?或者,如果我想添加我自己的方法/代码怎么办?试试这个:
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));
}
//}
}
}
你尝试过什么?你的问题在哪里?到目前为止,您已经说明了您想要实现的目标。听起来您想用一些getter和setter方法编写一个Java bean:)基本上我有它,所以当我单击login并登录到游戏时,它会让我登录,但当我尝试使用反射检查loggedIn布尔值时,它仍然会说我没有登录,即使我是。好像它没有读我正在运行的程序。伙计!您没有将值设置为“gotValues”。另一个问题是,您可能需要检查,您是否在单线程内运行程序。还有一件事:使用调试器!