Java 在没有getter或反射的情况下访问依赖字段

Java 在没有getter或反射的情况下访问依赖字段,java,Java,从前: 我有一个有很多领域的a班。我通过类B和类C的构造函数将类A注入它们,因为后两个需要与类A通信 问题: 所以我做了依赖注入,现在我注意到类B和类C很悲伤,因为它们无法访问设置为私有的类A中的字段。他们通过getter进行了尝试,但是类A很快变得太胖了,所以两个类都想知道是否有一种方法可以在没有getter的情况下访问依赖项的字段,并且不将它们设置为公共字段 示例(伪代码!!!): 继承和将字段设置为protected可以解决问题,但问题是每个子级都有不同的父级。我不想那样 所以我的问题是:

从前:

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

问题:

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

示例(伪代码!!!):

继承和将字段设置为protected可以解决问题,但问题是每个子级都有不同的父级。我不想那样

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

访问私有字段的唯一方法是使用as next:


但是,使用
反射API
应该是您最后的选择,因为在这种情况下,它更像是一种黑客手段,而不是真正的解决方案。

其次,
private
表示private,这意味着只能在其类中访问private字段,这意味着您必须创建一个包含更多开放限制的
方法
,以便从外部访问它,这意味着一个
Getter
…--好吧,你可以通过反射来实现,通过设置为“临时可访问”……但是如果你的目标是“不让课堂膨胀”…@AndrewL,那就大错特错了。我知道它是无效的java。主菜不见了那又怎样?私人数据也无法读取…我知道。阅读全文xD。@Tom我的另一个想法是将字段设置为“final and public”,但这会使它们immutable@Tom你说得对,对不起that@AlmightyR因为它是由注释生成的(所以在编译时)//另外还有其他有趣的特性,不仅仅是getter/setters是源代码吗?如果是,请贷记!=)我听说反思是邪恶的。在这种情况下,这是一种正确的理智的使用吗?我的另一个想法是:“公开决赛”,但这会让事情变得一成不变。@Asperger,如果你的目标是“避免代码膨胀”,正如你在OP中所描述的,那么在这种情况下,反思将远远不止是邪恶的。。。这就像。。。黑社会之王。。。xP@Asperger不,仅仅为了摆脱getter,反射绝对不是一个好主意。接受它们的需要,或者将您的类重构为几个类,或者使用Lombok自动生成它们,或者使用另一种支持属性的语言,而不需要Java的冗长,或者将这些解决方案组合起来。@NicolasFilotto哦,好吧。。。我想可能是受到了启发,因为代码基本相同。。。但话说回来,没有很多其他方法可以做到这一点,所以我想确保=P---PS:+1现在您已经澄清了在这种情况下反射是不合适的
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);
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);