Java 可以从在a类实例中创建的另一个B类实例访问a类实例的字段

Java 可以从在a类实例中创建的另一个B类实例访问a类实例的字段,java,Java,我想知道是否可以从在第一个类中创建的另一个类访问包含在类字段中的信息。我放了一小段Java代码来展示我想要做的事情 public class A { public String c = new String(); B b; ... ... ... public void doSomething() { b = new B(); } } public class B {

我想知道是否可以从在第一个类中创建的另一个类访问包含在类字段中的信息。我放了一小段Java代码来展示我想要做的事情

    public class A {
      public String c = new String();
      B b;
      ...
      ...
      ...
      public void doSomething() {

        b = new B();
      }
    }

    public class B {        

      ...
      ...
      ...
      public void retrieveInformationFromA() {

        // I need to retrieve the field "c" of A instance that's 
        // created the B instance 
      }
    }
注意:由于当前代码设计的限制,我无法在B中创建一个构造函数,其中包含一个类字段“c”的参数。由于遗留代码,我必须尽可能避免更改现有代码

我感谢任何帮助


更新:我已经更正了代码,我忘了在A中的字段“c”中添加公共修饰符。

因为您没有为字段“c”指定任何可见性(公共、私有、受保护),这意味着是“包保护的”,即与类A在同一个包中的所有类都可以直接访问该字段

因此,如果类A和类B在同一个包中,则可以直接从类B访问字段“c”

如果它们不在同一个包中,您无法正常访问它,但需要使用反射(这应该是绝对的最后手段):


编辑:但您仍然必须将对类a实例的引用传递给类B。如果您无法更改类B,则完全是运气不佳。

由于您没有指定字段“c”的任何可见性(公共、私有、受保护),因此暗示为“包保护”也就是说,与A类相同包中的所有类都可以直接访问该字段

因此,如果类A和类B在同一个包中,则可以直接从类B访问字段“c”

如果它们不在同一个包中,您无法正常访问它,但需要使用反射(这应该是绝对的最后手段):


编辑:但您仍然必须将对类a实例的引用传递给类B。如果您不能更改类B,则完全是运气不佳。

将字符串声明为静态

public class A {
  static String c = new String();
然后在B类中访问它

  public void retrieveInformationFromA() {

     String info = A.c;

    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
  }
如果c需要不同或非静态

  public void retrieveInformationFromA() {


     A obj = new A();
     String info = obj.c;

    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
  }

将字符串声明为静态

public class A {
  static String c = new String();
然后在B类中访问它

  public void retrieveInformationFromA() {

     String info = A.c;

    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
  }
如果c需要不同或非静态

  public void retrieveInformationFromA() {


     A obj = new A();
     String info = obj.c;

    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
  }

以我的经验,这是不可能的。 被调用的实例b除了你传下来的东西之外,对它周围的世界一无所知。 如果不希望或不能将c声明为静态,则可以包含一个具有类B的setter来传递“c”


另一种方法可以是中间的“InfoBase”类,它包含一个或多个不同类所需的字段。

根据我的经验,这是不可能的。 被调用的实例b除了你传下来的东西之外,对它周围的世界一无所知。 如果不希望或不能将c声明为静态,则可以包含一个具有类B的setter来传递“c”


另一种方法可以是中间的“InfoBase”类,它包含一个或多个不同类所需的字段。

您无法检索A的字段“c”,因为它是类A的私有成员。在这种情况下,要访问字段,请使用getter setters(在这种情况下是c)或将其公开(一种非常糟糕的方法)。快乐编码:)

您无法检索A的字段“c”,因为它是类A的私有成员。要在本例中访问字段,请使用getter setters(在本例中为c)或将其公开(一种非常糟糕的方法)。快乐编码:)

您可以这样做

// In class A
public void doSomething() {
    b = new B();
    b.retrieveInformationFromA(this);
}
...
// In class B
public void retrieveInformationFromA(A a) {
    String c = a.c; // This way you can get it
    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
}

你可以这样做

// In class A
public void doSomething() {
    b = new B();
    b.retrieveInformationFromA(this);
}
...
// In class B
public void retrieveInformationFromA(A a) {
    String c = a.c; // This way you can get it
    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
}

为c使用静态实例?为什么不能为
B
创建另一个构造函数?如果你做不到这一点,那么就没有办法知道创建它的
A
;如果你把类B定义为类a的一个私有内部类,你就有可能编辑你的帖子,并描述你可以在这段代码中更改什么(或者你不能更改什么),因为它太开放了。如果您可以更改方法签名,例如,添加“A”作为参数,但我觉得您不能这样做,因为遗留代码。@mol您也可以做邪恶的事情,使用ThreadLocal将A中的内容放入当前线程,然后从B中获取,但这是过度设计,危险,在多线程环境中无法工作。请为c使用静态实例?为什么不能为
B
创建另一个构造函数?如果你做不到这一点,那么就没有办法知道创建它的
A
;如果你把类B定义为类a的一个私有内部类,你就有可能编辑你的帖子,并描述你可以在这段代码中更改什么(或者你不能更改什么),因为它太开放了。如果您可以更改方法签名,例如添加“A”作为参数,但我觉得您不能这样做,因为遗留代码。@mol您也可以做一些不好的事情,使用ThreadLocal将A中的内容放入当前线程,然后从B中获取,但它设计过度,危险,在多线程环境中无法工作。