1

有可能在一个实例化自己的类中知道吗?我有一个可以被许多其他类实例化的类 Listener,所以在 Listener 中我想知道谁是“父亲”;

我不想用

if(objectA instanceOf Class)
....

但我认为是这样的:

if(this.instanceOf Class1)
    System.out.println("Hello i'm the class Listener instanced by Class1);
else if(this.instanceOf Class2)
    System.out.println("Hello i'm the class Listener instanced by Class2);

这是可能的还是我白痴?;) 谢谢尼古拉

4

3 回答 3

1

如果您只是在寻找调用构造函数的对象的类,那么这个问题可能就是您要寻找的。获取构造函数中的堆栈跟踪,并使用它来确定哪个类调用了构造函数。

如果您正在寻找特定的 Object 引用而不是类,则需要将其作为参数传递。

于 2013-01-05T19:16:44.057 回答
1

您可以这样做(只需删除.- this instanceof ClassA),但在我看来这是一种不好的做法。如果你想有一个依赖于子类的行为,只需在每个子类中实现一个方法并在此时调用它。

例如:

public class Parent
{
    public void foo()
    {
        bar();
    }

    public void bar()
    {
        System.out.println("Parent");
    }

    public static void main()
    {
        new Parent.foo(); // prints "Parent"
        new SubA.foo();   // prints "SubA"
        new SubB.foo();   // prints "SubB"
    }
}

public class SubA extends Parent
{
    @Override public void bar()
    {
        System.out.println("SubA");
    }
}

public class SubB extends Parent
{
   @Override public void bar()
    {
        System.out.println("SubB");
    }
}
于 2013-01-05T19:17:10.343 回答
1

如果我理解正确,您想知道哪些类(以及这些类的实例)包含对 Listener 类实例的引用。

一种可能的解决方案是创建一个接口(例如 ListenerHolder),该接口定义所有“侦听器持有者”必须具有的方法,并在侦听器的构造函数中接受它的实例。

public interface ListenerHolder {
    public void doSomething();
}

public class Listener {
    public Listener(ListenerHolder holder) {
        this.holder = holder;
    }

    public void doListener() {
        this.holder.doSomething();
    }

    private ListenerHolder holder;
}

话虽如此,也许您可​​以解释您要解决的真正问题是什么。我怀疑您应该考虑原始问题的其他可能解决方案。

于 2013-01-05T19:18:18.213 回答