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

Posted

技术标签:

【中文标题】java:从另一个类获取私有变量,而不设置getter [重复]【英文标题】:java: get private variable from another class, without setting a getter [duplicate] 【发布时间】: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。 见:***.com/questions/1196192/… 由于***.com/q/1196192/217324 已经涵盖了这方面的选项(反射、字节码黑客、不关心访问修饰符的替代 jvm 语言),因此投票结束。 【参考方案1】:

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

您有以下选择:

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

【讨论】:

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

【讨论】:

以上是关于java:从另一个类获取私有变量,而不设置getter [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从另一个目标中调用 maven 目标

我可以防止私有变量被同一类的其他对象更改吗?

在类中使用托管bean设置变量,并从另一个托管bean中的此类获取变量

需要解释:Java中的私有访问修饰符

从另一个类获取原始变量名[重复]

java 反射获取设置私有成员变量的值