属性对象是否可以到达它属于的对象?
对不起,这个问题可能很奇怪,但前一段时间我使用了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
?
您希望访问调用堆栈中函数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
}
这不是他正在谈论的场景 - 他谈论的情况是A和B完全不相关,而不是B是A中的内部类的情况 –
你不能那样做。如果B是A的成员,则意味着A'知道'B,但不是相反。你只能从A访问B,而不是相反。
如果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”的名称,然后破坏了代码,编译器也不会告诉你。
(我自己删除了这条评论,问题解决了)
'A a = new A; B b2 = a.b;'现在你会得到什么结果? –
为什么你需要那个场景 –
简短的回答:没有。长答案:没有。 –