获取已从父类调用方法的所有子类的列表

时间:2019-06-12 05:12:46

标签: 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新手

2 个答案:

答案 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的父类,所以所有的子类child1child2都已经具有方法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的答案。