有没有办法找出创建了哪个 class 实例 'this'

Is there a way to find out which class instance created 'this'

**我(class 的一个实例)想知道是哪个 class 实例化了我? 我有一个由 Class A 和 Class B 实例化的 class C。我想找出哪个 class 实例化了我,以便我可以从中访问变量class.

通常的方法是传入一个标识符,嘿我来自class A,并在构造函数中传入变量x,供C以适合它的方式使用。

**

例如:

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 ...
   }
}

不经过一些黑客攻击就无法知道(见下文)。这看起来像是一个接口的案例……

类 A 和 B 定义了具有 getX() 方法的 HasX。您可以将 class 传递给 C 的构造函数,它期望任何实现 HasX 的 class。然后 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 时做一些黑客攻击来找出 class。这是我曾经用于日志记录实现的一些代码,它可以通过回顾 Throwable 的 stracktrace 来检测谁是调用者。同样,这不是好的做法,但你这么问...... :)

发件人:https://github.com/slipperyseal/atomicobjects/blob/master/atomicobjects-lang/src/main/java/net/catchpole/trace/PrintTrace.java

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 "";
}

您可能希望将其编辑为简单的 return class 名称,或者甚至执行 Class.forName() 来解析实际的 class.

如果您想要实际的对象,并且每个 class 中只有 1 个,您可以在以 classname 为关键字的地图中输出对象。但是天哪,周围真是一团糟:)