知道自己是谁

时间:2013-01-05 19:13:46

标签: java object instanceof

可以在一个已经实例化的类中知道吗? 我有一个类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);

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

3 个答案:

答案 0 :(得分:1)

如果你只是在寻找调用构造函数的对象的类,那么this question可能就是你要找的东西。获取构造函数中的堆栈跟踪,并使用它来确定哪个类称为构造函数。

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

答案 1 :(得分: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");
    }
}

答案 2 :(得分:1)

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

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

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

话虽如此,也许你可以解释一下你正试图解决的真正问题。我怀疑你应该考虑原始问题还有其他可能的解决方案。