首页 > 解决方案 > 获取从父类调用方法的所有子类的列表

问题描述

我有以下情况:

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 新手

标签: java

解决方案


假设您使用的是 Java 9 或更高版本,则可以使用StackWalker API。它比抛出和捕获异常来访问堆栈跟踪要便宜得多。

API参考:

堆栈步行者。

walk 方法为当前线程打开一个顺序的 StackFrame 流,然后应用给定的函数来遍历 StackFrame 流。该流按顺序报告堆栈帧元素,从表示生成堆栈的执行点的最顶部帧到最底部帧。当 walk 方法返回时,StackFrame 流将关闭。如果尝试重用关闭的流,将抛出 IllegalStateException。

StackWalker 的堆栈遍历选项决定了要返回的 StackFrame 对象的信息。默认情况下,反射 API 和实现类的堆栈帧是隐藏的,并且 StackFrames 具有可用的类名和方法名,但没有 Class 引用。

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

孩子1:

public class Child1 extends Parent {
    Parent p1 = new Parent();
    public void abc() {
        p1.abc();
    }
}

孩子2:

public class Child2 extends Parent {
    Parent p1 = new Parent();
    public void abc() {
        p1.abc();
    }
}

示例输出:

Called from Child1
Called from Child2

注意: Child1 和 Child2 不需要扩展 Parent 来执行此操作。我假设您希望能够在不使用继承的情况下做到这一点,并且我希望尽可能接近您拥有的代码。


推荐阅读