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

Java 在调用方法时获取扩展超类的子类实例,java,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(); } 而且,正如评论所说,我想用

因此,我希望能够获得一个子类的实例,该子类在从超类调用方法时正在运行。例如,如果我上过这门课:

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检查类B(类A的子类)是否正在调用代码。

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

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

请注意,这会在任何深度查找调用:

for(final StackTraceElement element : Thread.currentThread().getStackTrace()) {
  if (element.getClassName().equals(B.class.getName())) {
    System.out.println("BINGO");    
  }
}
如果只想检查有限的深度,不要遍历所有数组

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

无论如何,如果可能的话,你应该尽量避免这样的事情。

检查这里:


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

事实上
B
在这里扩展
a
基本上是不相关的;你还没有在这里创建
B
的实例…代码甚至没有编译。修复了它。谢谢你指出:)如果你想“看看B类是否在调用代码”,你可以说
B的这个实例
(如果它是
B
的一个子类,它也是
true
),或者
this.getClass().equals(B.class)
(它是
true
,只针对
B
,而不是它的子类)。但是:不要这样做。99.9967%的时候你只需要重新考虑你的设计并正确使用多态性。这是回答这个问题的正确方法,但我想再次强调我在评论中所说的:不要这样做。多态性的发明是为了让程序员不必写这样的东西。我同意。更新了答案以重新迭代。
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();
    }
}