在调用方法时获取子类的实例来扩展超类

时间:2014-01-28 22:18:54

标签: java

因此,我希望能够在从超类调用方法时获取正在运行的子类的实例。例如,如果我有这个类:

public class A {
public void aMethod() {
    //Here is where I want to see if class B is calling the code
}
}

public class B extends A {
}

public class C {
B b = new B();
b.aMethod();
}

并且,正如评论所说,我想在aMethod中检查类A的子类B是否正在调用代码。

4 个答案:

答案 0 :(得分:4)

正如已经向您指出的那样,几乎没有理由这么做而且我同意您应该使用多态而不是。但是,如果您“需要”执行此操作或只是想知道如何执行此类操作,则可以在方法内的instanceof上使用this

class A {
    public void aMethod() {
        if (this instanceof B) {
            System.out.println("I'm a B!");
        }
    }
}

public class B extends A {

    public static void main(String[] args) {
        B b = new B();
        b.aMethod();
    }
}

答案 1 :(得分:1)

public class A {

    public void aMethod() {
        if(this.getClass() == B.class){
            System.out.println("huhuhuuuuuuuuuuuuuuuuu");
        }
    }
}

public class B extends A {


}

public class C {

    public static void main(String[] args) {
        B b = new B();
        b.aMethod();
    }
}

答案 2 :(得分:0)

请注意,这会在任何深度发现一个电话:

for(final StackTraceElement element : Thread.currentThread().getStackTrace()) {
  if (element.getClassName().equals(B.class.getName())) {
    System.out.println("BINGO");    
  }
}

如果您只想检查有限的深度,请不要遍历所有数组。

这可能是有用的,例如如果某个框架强制您使用特殊方法或无参数构造函数,但您不希望任何开发人员直接调用此方法。 (是的,它是一个黑客,但有时奇怪的框架迫使你做奇怪的事情)。然后你可以在不需要的方法中有一个断言,如果它被你的代码的错误角调用,就会抛出异常。

无论如何,你应该尝试尽可能避免这样的事情。

答案 3 :(得分:0)

点击此处:How to get the caller class in Java

@dystroy答案的第二部分可能是一个开始。