对不起这个问题可能很奇怪,但前段时间我使用了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
?
答案 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)
(我自己删除了此评论,问题已解决)