在Java中访问私有变量

在Java中访问私有变量,java,private,access-control,Java,Private,Access Control,我想从下面的代码中访问实例变量total time: public abstract class Controller{ protected int currentTime; protected int totalTime; protected Agent[][][] player; 在下面的代码中 public class S2842663BloodBankAgent extends BloodBankAgent { private BoardComp

我想从下面的代码中访问实例变量
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 ); 
    }
}
将getter方法添加到
控制器
类,如下所示:

...
public int getTotalTime() {
    return totalTime;
}
...
编辑:然后在另一个类中访问它(在初始化
控制器之后)


在其他类的实例上访问不可访问的字段通常是一个坏主意,但在某些情况下,这是使某些内容正常工作的唯一方法

我的建议是:首先检查一下是否没有其他方法可以实现你想要的

然而,在有些情况下,没有其他办法。例如,您使用的是第三方库,由于某些原因,您不允许对其进行修改,并且您需要访问其中未以任何其他方式公开的字段

如果你真的需要做的话,我会在代码周围放很多大的警告注释,这样在你之后必须维护代码的人至少知道有什么不好的事情正在发生,以及你的理由是什么


也就是说,有一种方法可以使用反射API访问不可访问的字段。 它并不总是有效:如果安装了
SecurityManager
,您的尝试将被拒绝。因此,它不能在JavaWebStart应用程序或小程序中工作,例如,也不能在带有SecurityManager的应用程序服务器上工作。但在大多数情况下,它确实有效

用于读取无法访问的int字段的代码:

import java.lang.reflect.Field;
// [...]
公共静态int accessTotalTime(控制器c){
试一试{
字段totalTime=Controller.class.getDeclaredField(“totalTime”);

首先,在类控制器中添加getter和setter。。
然后先用BloodBankAgent然后用S2842663BloodBankAget以多级方式继承该类。

什么实例的实例变量?
S2842663BloodBankAgent
-这是什么类型的代理?:如果您共享显示代理对控制器使用的引用的代码片段,这将非常有用。对不起,我很抱歉在论坛上发布的新消息
...
Controller controller = new Controller();
//...do necessary things.
int time = controller.getTotalTime();
...
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);
    }
}