有没有办法找出创建的类实例' this'

时间:2015-01-08 02:27:26

标签: public

**我(一个类的一个实例)想知道哪个类实例化了我? 我有一个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 ...
   }
}

1 个答案:

答案 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来检测谁是调用者。再说一遍,这不是一个好习惯,但是你这样问......:)

来自: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 "";
}

您可能希望编辑它以简单地返回类名,甚至可以使用Class.forName()来解析实际的类。

如果你想要实际的对象,并且每个类只有1个,你可以在一个键入classname的Map中输出对象。但是真是太乱了。)