java:从另一个类获取私有变量,而不设置getter



我不允许更改类A,但我需要获得"A"的值(在构造函数中设置)。有人能告诉我怎么做吗?其他所有的解决方案似乎都在a类中提出了一个getter。我不允许以任何方式对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(){
        ???
    } 
}

附言:张贴这个问题,因为每一个类似的问题都是通过改变A级来回答的,而我不允许这样做。但由于似乎只有反思,这个问题可以关闭。谢谢各位。

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

您有以下选项:

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

最好的决定是拥有一个getter。在编程最佳实践方面,它是最安全、最干净的解决方案。

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

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

但请记住,这被认为是超级黑客,强烈反对。

以下是

    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;
}

最新更新