java - 获取从父类调用方法的所有子类的列表
问题描述
我有以下情况:
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 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 来执行此操作。我假设您希望能够在不使用继承的情况下做到这一点,并且我希望尽可能接近您拥有的代码。
推荐阅读
- angular - Firestore 在 Ionic / Angular 应用程序中的功能无法按预期工作
- data-structures - 在 O(1) 中使用 push/pop/midPop 并在小于 O(N) 中使用 getMin 的设计堆栈。空间不受约束
- python - 如何从子类访问 MainWindow.Widget?
- javascript - 如何使用 vuejs、axios 在关系数据库 Laravel 模型中获取数据
- ruby-on-rails - 为什么新数据没有以嵌套形式保存?
- security - SPA+API 服务器和传统 Web 应用的单一身份验证模型(OIDC 方式)
- django - 发布新记录时如何包含 user_id (foreignKey)?
- python - 如何根据格兰杰因果检验估计最优模型?
- angular - 在效果管道中组合选择器或检索动作参数
- java - Eclipse 子项目中的 Maven 依赖项未出现在 Java 类路径中