**我(一个类的一个实例)想知道哪个类实例化了我? 我有一个C类,它由A类和B类实例化。我想找出哪个类实例化了我,以便我可以从该类访问该变量。
通常的方法是传入一个标识符,嘿我来自A类,并传入构造函数中的变量x,以便以适合它的方式使用。
**
例如:
public Class A
{
public int x;
public A()
{
C c = new C();
}
}
public Class B
{
public int x;
public B()
{
C c = new C();
}
}
public Class C
{
public CMethod()
{
// I want Access int x from the class that instantiated me.
if I know its B then B.x ...
}
}
答案 0 :(得分:0)
没有一些黑客行为就无法知道(见下文)。这看起来像是一个接口......
类A和B定义HasX,它具有getX()方法。您可以将任一类传递给C的构造函数,该构造函数需要任何实现HasX的类。然后C可以在任一对象上调用getX,并且它不需要知道它实际是哪种类型,但它将获得适当的X值。
public interface HasX {
public int getX();
}
public class A implements HasX {
private int x;
public A()
{
C c = new C(this);
}
public int getX() {
return x;
}
}
public class B implements HasX {
private int x;
public B() {
C c = new C(this);
}
public int getX() {
return x;
}
}
public class C {
HasX hasX;
public C(HasX hasX) {
this.hasX = hasX;
}
public void doStuff() {
int x = hasX.getX();
}
}
虽然回答你原来的问题,创建对象的对象并没有存储在任何地方......但是当构造C来查找类时,你可以做一些黑客攻击。下面是我曾经用于Logging实现的一些代码,它可以通过回顾Throwable的stracktrace来检测谁是调用者。再说一遍,这不是一个好习惯,但是你这样问......:)
public C() {
String whoCalledMe = whereAmI(new Throwable());
}
private String whereAmI(Throwable throwable) {
for (StackTraceElement ste : throwable.getStackTrace()) {
String className = ste.getClassName();
// search stack for first element not within this class
if (!className.equals(this.getClass().getName())) {
int dot = className.lastIndexOf('.');
if (dot != -1) {
className = className.substring(dot + 1);
}
return className + '.' + ste.getMethodName();
}
}
return "";
}
您可能希望编辑它以简单地返回类名,甚至可以使用Class.forName()来解析实际的类。
如果你想要实际的对象,并且每个类只有1个,你可以在一个键入classname的Map中输出对象。但是真是太乱了。)