【问题标题】:java: get private variable from another class, without setting a getter [duplicate]java:从另一个类获取私有变量,而不设置getter [重复]
【发布时间】:2016-07-12 06:19:34
【问题描述】:

我不允许更改 A 类,但我需要获取 'a' 的值(在构造函数中设置)。谁能告诉我该怎么做?其他所有解决方案似乎都建议在 A 类中使用吸气剂。我不允许以任何方式对 A 类进行更改,也不能更改为公共等。魔法必须在 B 类中发生。

public class A{
    private int a;
    public A(int x){
        a = x * 10;
    }
}

public class B{
    public B(int x){
        A instA = new A(x);
    }

    public int geta(){
        ???
    } 
}

PS:发布了这个问题,因为每个类似的问题都通过更改 A 类来回答,而我不允许这样做。但既然似乎只有反思,这个问题就可以结束了。谢谢大家。

【问题讨论】:

  • 如果成员变量是私有的,那么在外部访问它的唯一方法是通过某种方法...
  • 你不能给A添加getter,但是你可以以任何方式修改A吗?如果是,您可能会将private int a; 更改为public int a;。另外,请说明为什么不允许添加 getter。
  • 由于stackoverflow.com/q/1196192/217324 已经涵盖了这方面的选项(反射、字节码黑客、不关心访问修饰符的替代 jvm 语言),因此投票结束。

标签: java getter private-members


【解决方案1】:

这就是 private 字段的全部意义;它们不能在封闭类的范围之外访问。

您有以下选择:

  1. 更改该类以提供 getter
  2. 改变你的整体设计,要么不需要那个值;要么或找到另一种方法使其对两个类都可用
  3. 不推荐:使用反射及其在运行时覆盖“私有”保护的能力

【讨论】:

  • 谢谢。我理解私有领域的意义。我想练习的措辞是错误的。我不认为反射是我们应该使用的解决方案。我希望有人能在这里指出我无法看到的解决方案。我认为我们不允许更改给定的方法,而是添加一些,否则似乎只有反射......
【解决方案2】:

最好的决定是有一个吸气剂。就编程最佳实践而言,这是最安全、最干净的解决方案。

使用反射可以实现您想要的 - 您可以按名称查找字段(如果名称在未来版本的类中发生更改怎么办?)并提取它的值,如下所示:

A a = new A(5);
Field field = A.getField("a");
field.setAccessible(true);
int value = field.get(a);

但请记住,这被认为是超级 hacky,强烈建议不要这样做。

【讨论】:

  • 部分同意,但在访问该字段之前应再添加一行:field.setAccessible(true);
  • @Aliaxander 确实如此。
【解决方案3】:

你可以这样做

    public int geta(){
        Field field;
        int x = 0;
        try {
            field = A.class.getDeclaredField("a");
            field.setAccessible(true);
            x = field.getInt(this.a);
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
    System.out.println(x);
    return x;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2013-11-28
    • 2018-09-21
    • 2018-09-18
    相关资源
    最近更新 更多