因此,我希望能够在从超类调用方法时获取正在运行的子类的实例。例如,如果我有这个类:
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是否正在调用代码。
答案 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答案的第二部分可能是一个开始。