【问题标题】:Accessing fields of dependency without getters or reflection [duplicate]在没有 getter 或反射的情况下访问依赖字段 [重复]
【发布时间】:2017-02-09 23:46:03
【问题描述】:

从前:

我有一个有很多领域的classA。我通过它们的构造函数将 A 类注入到 B 类和 C 类,因为最后两个需要与 A 类通信。

问题:

所以我已经完成了依赖注入,现在我注意到 B 类和 C 类很伤心,因为它们无法访问 A 类中设置为私有的字段。他们通过 getter 进行了尝试,但 A 类很快变得太胖了,因此两个类都想知道是否有一种方法可以在没有 getter 且不将它们设置为 public 的情况下访问其依赖项的字段。

示例(伪代码!!!):

class A {
 private field1 = 1;
 private field2 = 2;
 private field3 = 3;
 private field4 = 4;
 private field5 = 5;
 private field6 = 6;
}

class B {
    public B(A a) {
      System.out.print(a.field1);
    }
}

class C {
    public B(A a) {
      System.out.print(a.field2);
    }
}

A a = new A();

new B(a);
new C(a);

继承并将字段设置为受保护可以解决问题,但问题是每个孩子都有不同的父母。我不想那样。

所以我的问题是: 如何在没有 getter 或反射的情况下访问依赖项的字段?

【问题讨论】:

  • 其次,private 表示私有,这意味着私有字段只能在其类中访问,这意味着您必须创建一个更开放的限制 method 才能从外部访问它,这意味着 Getter... --- 好吧,您可以通过反射来完成它,通过设置为临时访问...但是那如果您的目标是“不让班级膨胀”,那将是非常错误...
  • @AndrewL。我知道它无效的java。主线不见了怎么办?私人数据也无法读取……我知道。阅读全文 xD。
  • @Tom 我的另一个想法是将字段设置为“最终和公开”,但这会使它们不可变
  • @Tom 你是对的,对此感到抱歉
  • @AlmightyR 因为它是由注解生成的(所以在编译时) // 作为旁注,还有其他有趣的功能,而不仅仅是 getter/setter

标签: java


【解决方案1】:

访问私有字段的唯一方法是使用Reflection API作为下一个:

Field field1 = A.class.getDeclaredField("field1");
// Make it accessible as it is a private field otherwise you won't be able to get the value
field1.setAccessible(true);
MyClass obj = (MyClass) field1.get(a);

但是,使用Reflection API 应该是你最后的手段,因为在这种情况下,它更像是一种破解,而不是真正的解决方案。

【讨论】:

  • this 的来源吗?如果是的话,请信用! =)
  • 我听说反射是邪恶的。在这种情况下,它会是还是适当的理智使用?我的另一个想法是:“public final”,但这会使事情变得不可变。
  • @Asperger,如果您的目标是“避免代码臃肿”,正如您在 OP 中所描述的那样,那么在这种情况下,反思将不仅仅是 evil.. . 就好像...冥界之王... xP
  • @Asperger 不,它的反射绝对不是一个好主意,只是为了摆脱吸气剂。接受它们是需要的,或者将你的类重构为几个,或者使用 Lombok 自动生成它们,或者使用另一种支持属性的语言而不是 Java 的冗长,或者结合其中的几个解决方案。
  • @NicolasFilotto 哦,那好吧...以为可能受到启发,因为代码基本相同...但是话又说回来,没有很多其他方法可以做到,所以我想确保... =P --- PS:+1 既然您已经澄清在这种情况下反射是不合适的。 =)
猜你喜欢
  • 2021-10-18
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2017-06-15
  • 1970-01-01
  • 2018-11-03
相关资源
最近更新 更多