gpt4 book ai didi

java - 如何在运行时更改 ATM 类(Java 反射)

转载 作者:搜寻专家 更新时间:2023-11-01 03:00:13 24 4
gpt4 key购买 nike

有一个 ATM GUI .class。

在ATM类中,如果用户点击刷卡,它会使用Java反射动态调用我的Card.class。

在 ATM 类中有这个变量:

int userBalanceField = 100;

我正在尝试将其动态更改为 Integer.MAX_VALUE。

这是 ATM 中的刷卡功能:

    Object object;
Class class_ = null;
ClassLoader classLoader;
this.printToScreen("Loading Card");
String string = "." + File.separator + "Card.class";
File file = new File(string);
ClassLoader classLoader2 = classLoader = ClassLoader.getSystemClassLoader();
try {
object = new URL("file:" + System.getProperty("user.dir") + File.separator + "Card.class");
class_ = Card.class;

}
catch (MalformedURLException var6_7) {
var6_7.printStackTrace();
}
object = "Card";

this.printToScreen("Reading card data and verifying ATM");
try {
Method method = class_.getMethod("swipe", ATM.class);
Data data = (Data)method.invoke(null, this);
if (data == null) {
this.printToScreen("Machine considered invalid");
} else {
this.user = data;
this.tempEntry = "";
this.screenState = 2;
this.updateScreen();
}
}
catch (SecurityException var8_11) {
this.printToScreen("Security Exception when swiping card.");
}
catch (NoSuchMethodException var8_12) {
this.printToScreen("No Such method exception when swiping card.");
}
catch (IllegalArgumentException var8_13) {
this.printToScreen("Illegal Argument exception when swiping card.");
}
catch (IllegalAccessException var8_14) {
this.printToScreen("Illegal Access exception when swiping card.");
}
catch (InvocationTargetException var8_15) {
this.printToScreen("Invocation Target exception when swiping card.");
}

这是我的尝试。

    public static ATM.Data swipe(ATM anATM){ 

Class atmClass = anATM.getClass();
try {
Field moneyInMachineField = atmClass.getDeclaredField("moneyInMachine");
System.out.println("Loading field..." + moneyInMachineField.getName());

Field userBalanceField = atmClass.getDeclaredField("userBalance");
userBalanceField.setAccessible(true);


ATM.Data result = new ATM.Data(cardNumber, accountNumber, name, pinNumber);
userBalanceField.set(result, Integer.MAX_VALUE);

return result;
} catch (IllegalAccessException
| NoSuchFieldException
| SecurityException e) {
e.printStackTrace();
}
return null;
}

我不断收到“刷卡时调用目标异常”。

最佳答案

您使用的语法用于创建新的非静态内部类。 DataATM 的一个静态内部类,所以你想做如下的事情:

ATM.Data result = new ATM.Data(cardNumber, accountNumber, name, pinNumber);

根据Java Docs

For example, to create an object for the static nested class, use this syntax:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

如果 Data 是非静态的,它将包含对 ATM 的特定引用(这将使其能够引用 AMT.this.userBalance),但它仅用作 POJO。

除了上述之外,您还错误地设置了字段。调用 field.set() 时,您需要为其提供包含该字段的对象以及您要将其设置为的值。

在您的情况下,它将是:

userBalanceField.set(anATM, Integer.MAX_VALUE);

参见 Java doc

关于java - 如何在运行时更改 ATM 类(Java 反射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36930901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com