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