属性对象是否可以到达属于它的对象?

时间:2015-09-25 17:54:49

标签: java introspection

对不起这个问题可能很奇怪,但前段时间我使用了python的内省,我想知道Java 1.8中是否有这样的东西。

所以,假设我在类似的情况下有来自班级a的对象A

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

我的问题是“可以f()了解a吗?”

显然,如果我添加一个后向链接,它可以是:

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

4 个答案:

答案 0 :(得分:1)

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

或者您可以使用内部类。内部类包含外部类实例的隐藏字段。可以使用语法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
}

答案 1 :(得分:1)

如果A和B在同一个包中,则B知道A中的字段b暴露给B.这是可能的,因为您在A中声明了字段b,其默认可见性是“包的私有”。

否则,如果您更改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”的名称,然后您破坏了代码并且编译器不会告诉您。

答案 2 :(得分:0)

你不能这样做。如果B是A的成员,则意味着A'知道' B,但不是相反。你只能从A访问B,而不是相反。

答案 3 :(得分:0)

(我自己删除了此评论,问题已解决)