2015-09-25 93 views
1

对不起,这个问题可能很奇怪,但前一段时间我使用了python的自省,我想知道在Java 1.8中是否可以使用类似的东西。属性对象是否可以到达它属于的对象?

所以我们可以说我有一个对象aA类在这样

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

+1

'A a = new A; B b2 = a.b;'现在你会得到什么结果? –

+0

为什么你需要那个场景 –

+2

简短的回答:没有。长答案:没有。 –

回答

1

您希望访问调用堆栈中函数upper的参数。在香草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

这不是他正在谈论的场景 - 他谈论的情况是A和B完全不相关,而不是B是A中的内部类的情况 –

0

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

1

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

否则,如果你改变一种用于

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

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

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

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

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

0

(我自己删除了这条评论,问题解决了)