属性对象能否到达它作为属性的对象?

Can an attribute object reach the object for which it is an attribute?

很抱歉这个问题可能很奇怪,但前段时间我使用了 python 的内省,我想知道 Java 1.8 中是否可以使用类似的东西。

假设我有一个来自 class A 的对象 a 在这种情况下

class A{ B b; }
class B{ public void f(){} }

我的问题是"can f() know about a?"

显然,如果我向后添加 link,它可以,例如:

class A {
    B b;  
    public A() { b = new B(this); } 
}

class B {
    A father; 
    public B(A a){ this.father = a; } 
    public void f(){} 
}

但我的问题是,在一般情况下,没有像father左右的背影,是否有任何内省机制可以让f()知道a

您希望访问调用堆栈上层函数的参数。在 vanilla Java 你无法做到这一点,但是你可以使用一些 AOP 框架,它可以维护一个影子堆栈,所以你可以内省它。

或者您可以使用内部 classes。内部 classes 包含外部 class 实例的隐藏字段。可以使用语法 OuterClass.this.

访问它
class A{
  public class B{ 
    public void f() {
      System.out.println(A.this.aField);
    }    
  }
  String aField;
  B b = new B(); // Passes a hidden `this` parameter
}

你不能那样做。如果 B 是 A 的成员,则表示 A 'knows' B,反之则不然。您只能从 A 访问 B,反之则不行。

如果 A 和 B 在同一个包中,B 知道 A 中的字段 b 暴露给 B。这是可能的,因为您声明了 A 中的字段 b,默认可见性为 "private to the package" .

否则,如果将 A 更改为

    class A{ private B b;  
        public A(){ b=new B(this); } 
    }

然后你只能像这样使用反射从A访问字段B(假设这段代码在B的一个方法中:

Field privateStringField = A.class.getDeclaredField("b");
privateStringField.setAccessible(true);

B value = (B) privateStringField.get(this);

现在这是个坏主意,因为你更改了 A 中字段 "b" 的名称,然后你破坏了你的代码,编译器不会告诉你。