我有以下情况:
public class parent{
public void abc(){
some logic ....
}
}
public class child1 extends parent{
parent p1 = new parent();
p1.abc();
}
public class child2 extends parent{
parent p1 = new parent();
p1.abc();
}
从上述情况中可以知道,在父类中天气“ child1”类已调用父调用的方法“ abc()”或在运行时已调用“ child2”
请帮助
我是Java新手
答案 0 :(得分:0)
假设您使用的是Java 9或更高版本,则可以使用StackWalker API。这比抛出并捕获异常以访问堆栈跟踪要便宜得多。
API参考:
堆垛机。
walk方法为以下对象打开StackFrames的顺序流: 当前线程,然后应用给定函数来遍历 StackFrame流。流按顺序报告堆栈框架元素, 从最上方的框架开始,该框架代表执行点 堆栈生成到最底部的帧。 StackFrame 当walk方法返回时,流关闭。如果尝试 要重用封闭的流,将抛出IllegalStateException。
StackWalker的堆栈行走选项确定信息 返回的StackFrame对象的数量。默认情况下, 反射API和实现类被隐藏并且StackFrames 有可用的类名和方法名,但没有类 参考。
StackWalker是线程安全的。多个线程可以共享一个 StackWalker对象遍历其自己的堆栈。权限检查是 创建StackWalker时,根据其选项执行 要求。在堆栈遍历时不会进行进一步的权限检查。
父母:
public class Parent {
public void abc() {
final StackWalker walker = StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE);
Class<?> caller = walker.getCallerClass();
System.out.println("Called from "+caller.getName());
}
}
Child1:
public class Child1 extends Parent {
Parent p1 = new Parent();
public void abc() {
p1.abc();
}
}
Child2:
public class Child2 extends Parent {
Parent p1 = new Parent();
public void abc() {
p1.abc();
}
}
示例输出:
Called from Child1 Called from Child2
注意:Child1和Child2不需要扩展Parent即可执行此操作。我假设您希望能够在不使用继承的情况下执行此操作,并且我想尽可能地接近所拥有的代码。
答案 1 :(得分:-1)
您不一定需要在子类对象中实例化父类。但是,由于您是extending
的父类,所以所有的子类child1
和child2
都已经具有方法abc
(继承)。
如果使用子类对象调用方法,则可以在父类中获得调用类名称。
这是一个示例:
public class Parent {
public void abc() {
System.out.println(" Calling Class name:" + getClass().getName());
}
public static void main(String[] args) {
Parent parent = new Parent();
Child1 child1 = new Child1();
Child2 child2 = new Child2();
WhatEverThatExtends haha = new WhatEverThatExtends();
parent.abc();
child1.abc();
child2.abc();
haha.abc();
}
}
class Child1 extends Parent {
}
class Child2 extends Parent {
}
class WhatEverThatExtends extends Parent {
}
示例输出是:
Calling Class name:Parent
Calling Class name:Child1
Calling Class name:Child2
Calling Class name:WhatEverThatExtends
如果您始终想知道呼叫类名称,不管它是否扩展,请查看@Tibrogargan的答案。