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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章