我想从下面的代码中访问实例变量total time
:
public abstract class Controller{
protected int currentTime;
protected int totalTime;
protected Agent[][][] player;
在下面的代码中
public class S2842663BloodBankAgent extends BloodBankAgent {
private BoardComponentList knownBloodBanks;
private BoardComponentList knownDonor;
public S2842663BloodBankAgent(){
super();
knownBloodBanks = new BoardComponentList();
knownDonor = new BoardComponentList();
}
public S2842663BloodBankAgent( BoardComponent bC ) {
super( bC );
}
}
答案 0 :(得分:2)
将 getter 方法添加到Controller
类中:
...
public int getTotalTime() {
return totalTime;
}
...
编辑:然后在其他课程中访问它(在初始化Controller
之后)。
...
Controller controller = new Controller();
//...do necessary things.
int time = controller.getTotalTime();
...
答案 1 :(得分:1)
在其他类的实例上访问不可访问的字段通常是一个坏主意,但在某些情况下,这是获得某些功能的唯一方法。
我的建议:首先检查是否没有其他方法可以达到你想要的效果。
然而,在某些情况下,没有别的办法。例如,您使用的第三方库由于某种原因不允许您修改,并且您需要访问其中未以任何其他方式公开的字段。
如果你真的需要这样做,我会在代码周围发出很多重要的警告意见,以便那些必须维护代码的人至少知道发生了什么不好的事情,以及你的推理是什么因为它是。
也就是说,有一种方法可以使用Reflection API来访问不可访问的字段。
它并不总是有效:如果安装了SecurityManager
,您的尝试将被拒绝。因此,它不会在JavaWebStart应用程序或Applet中工作,或者在具有SecurityManager的应用程序服务器上工作。但在大多数情况下,它确实有效。
用于读取其他无法访问的int
字段的代码:
import java.lang.reflect.Field;
// [...]
public static int accessTotalTime(Controller c) {
try {
Field totalTime = Controller.class.getDeclaredField("totalTime");
totalTime.setAccessible(true); // <-- Necessary for inaccessible fields
return totalTime.getInt(c);
} catch (IllegalAccessException | NoSuchFieldException e) {
throw new Error(e);
}
}
您可以将此方法放在代码中的任何位置,这样您就可以阅读totalTime
子类实例的Controller
字段。
答案 2 :(得分:0)
首先,添加getter&amp;类控制器中的setter .. 然后使用BloodBankAgent然后使用S2842663BloodBankAget继承多级别的类。