【问题标题】:Accessing a private variable in Java在 Java 中访问私有变量
【发布时间】:2014-09-21 01:46:36
【问题描述】:

我想通过下面的代码访问实例变量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 ); 
    }
}

【问题讨论】:

  • 什么实例的实例变量?
  • S2842663BloodBankAgent - 这是什么代理? :D
  • 如果您将显示代理使用的引用的代码分享给控制器会非常有帮助。
  • 对不起,我在论坛发帖很新

标签: java private access-control


【解决方案1】:

Controller 类中添加一个getter 方法:

...
public int getTotalTime() {
    return totalTime;
}
...

编辑:然后在其他类中访问它(在初始化 Controller 之后)。

...
Controller controller = new Controller();
//...do necessary things.
int time = controller.getTotalTime();
...

【讨论】:

    【解决方案2】:

    访问其他类实例上的不可访问字段通常是个坏主意,但在某些情况下,它是使某些东西起作用的唯一方法。

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

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

    如果你真的需要,我会在代码周围放置很多大的警告信息,以便在你之后必须维护代码的人至少知道发生了不好的事情,以及你的推理因为它是。


    也就是说,有一种方法可以使用反射 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);
        }
    }
    

    您可以将此方法放在代码中的任何位置,它可以让您读取Controller 子类实例的totalTime 字段。

    【讨论】:

      【解决方案3】:

      首先,在 Controller 类中添加 getter & setter .. 然后先用 BloodBankAgent 多级继承该类,然后用 S2842663BloodBankAget..

      【讨论】:

        猜你喜欢
        • 2012-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        相关资源
        最近更新 更多