Java 有没有一种好方法可以知道某个方法是由父级调用的还是从其他地方调用的?

Java 有没有一种好方法可以知道某个方法是由父级调用的还是从其他地方调用的?,java,inheritance,Java,Inheritance,我有下面的代码,其中的目标是,当一个方法在父对象上被调用时,它会在它的所有子对象上调用相同的方法,这就是实际工作完成的地方 public class Parent { Child[] children; public doWork() { for(int i = 0; i < children.size(); i++) //For all my children children.get(i).dowork();

我有下面的代码,其中的目标是,当一个方法在父对象上被调用时,它会在它的所有子对象上调用相同的方法,这就是实际工作完成的地方

public class Parent {

    Child[] children;

    public doWork() {
        for(int i = 0; i < children.size(); i++) //For all my children
            children.get(i).dowork();            //Call the same method
        Log.ReportWorkBeingDone(this);           //Report this has happened
    }
}

public class Child extends Parent{

    @override
    public doWork() {
        //Actual Work                            //Run the actual code
        Log.ReportWorkBeingDone(this);           //Report this has happened
    }
}
您的解决方案(
skillyhiddenwork
)是最好的解决方案。。。虽然你选择的名字没有抓住重点。(这不是“鬼鬼祟祟”。这是做这种事情的常见模式。)

是的,可以找到调用方法的名称,但是Java1不支持这个名称,而且这个过程非常昂贵。实例化一个异常对象,然后查看由
Throwable::getStackTrace
返回的异常捕获的堆栈帧。(这就是log4j等记录器框架在封面下所做的…)

另见:2


1-没有特定的“获取调用方名称”方法。此外,我描述的方法实际上是不可移植的,因为它允许
Throwable::getStackTrace
返回空的帧数组


2-最上面的答案暗示了几个不可移植的替代方案。使用
StackWalker
API的Java 9版本很有希望,但它仍然相对昂贵,因为
StackWalker
需要快照堆栈帧。

正如您所写的那样。我将只使用name
doWork
doWork和log
我很确定AspectJ可以做到这一点,但我怀疑是否值得为此引入新的依赖项。另一种方法是将
布尔值isParent
传递到
doWork
中,并仅在其为真时进行日志记录。选中LoggerFactory[]?同样,您可以创建一个新的异常(但不抛出它),调用它的getStackTrace并检查输出,但这很昂贵。同意这是可以的,但选择一个更好的名字。如果您的日志函数接受
这个
(并调用它的getClass?),您甚至不需要重写子函数中的doWork。也要考虑是否应该在工作之前或之后进行日志记录。您还可以使用Java“for each”,即
for(父p:children){p.skillyhiddenwork();}
而不是索引和获取。
public class Parent {

    Child[] children;

    public doWork() {
        sneakyHiddenWork();
        Log.ReportWorkBeingDone(this);                     //Report this has happened
    }

    protected sneakyHiddenWork(){
        for(int i = 0; i < children.size(); i++)           //For all my children
            children.get(i).sneakyHiddenWork();            //Call the same method
    }

}

public class Child extends Parent{

    @override
    protected sneakyHiddenWork() {
        //Actual Work                                      //Run the actual code
    }
}