属性对象能否到达它作为属性的对象?
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" 的名称,然后你破坏了你的代码,编译器不会告诉你。
很抱歉这个问题可能很奇怪,但前段时间我使用了 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" 的名称,然后你破坏了你的代码,编译器不会告诉你。