在没有 getter 或反射的情况下访问依赖字段 [重复]

Posted

技术标签:

【中文标题】在没有 getter 或反射的情况下访问依赖字段 [重复]【英文标题】:Accessing fields of dependency without getters or reflection [duplicate] 【发布时间】: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 【参考方案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 既然您已经澄清在这种情况下反射是不合适的。 =)

以上是关于在没有 getter 或反射的情况下访问依赖字段 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java 反射

超级全面的 Lombok 注解介绍,学一波

java 反射

Getter Setter:使用还是不使用?

访问修饰符也会影响反射吗?

Dart中类的getter和setter