找出调用我的方法是哪个

3

我正在寻找一种方法,可以获取调用我的完整方法签名。

例如:

public class Called {

    public void whoCallMe() {
        System.out.println("Caller Method: " + new Throwable().getStackTrace()[1].getMethodName());
    }
}

public class Caller {

public static void run(int i) {
    new Called().whoCallMe();
}

public static void run(String str) {
    new Called().whoCallMe();
}

public static void run(boolean b) {
    new Called().whoCallMe();
}

/** MAIN **/
public static void main(String[] args) {
    run("hi");
}

我实现的 whoCallMe() 方法可以看到 run 方法调用了它,但由于我有 3 个重载方法,无法确定是哪个方法调用了 whoCallme,因为 whoCallme 只返回 "run" 作为方法名称。

你们知道其他方法可以获取完整的方法签名吗,比如 run(java.lang.String)?


你需要使用调试API。你也可以使用字节码工具根据行号查找方法。 - biziclop
为什么你需要这样做? - Jeffrey
也许这个链接可以帮到你:https://dev59.com/f3RC5IYBdhLWcg3wD83r - SWoeste
1个回答

1
您可以使用AspectJ创建一个方面,它将应用于每个方法调用,并将有关所调用方法的详细信息添加到每个线程堆栈中,然后在方法完成后将其删除。当然,这将非常昂贵。很可能您不想这样做。此外,您不希望抛出任何异常以查找调用者。
基本上,对于您的问题的答案是:不要这样做。解释一下为什么您认为需要这样做,有人会给您一个好的替代方案。
另外,再想一想,您可以认为方法重载(而不是覆盖!)是有害的。您真的需要具有不同参数和相同名称的多个不同方法吗?

没有评论就给踩是不礼貌的。 - MK.
我仍然不太明白为什么你需要知道是谁调用了你,而不能只要求传递另一个参数? - MK.
好的,让我们深入一点...当我的系统加载时,所有注释都被缓存在哈希中(键=方法签名,值=注释值),以提高性能,避免反射。这些注释用于设置每个方法的一些日志信息。这就是为什么我需要知道调用者方法是谁,然后在哈希缓存中搜索其元数据。我可以使用额外的参数或类似的东西来获取这样的日志数据,但对于用户来说,只需放置一个注释即可更加优雅/简单(优雅,而不是简单):) 谢谢老兄! - VeryNiceArgumentException
当你听到“日志记录”时,它总是暗示着这可能是 AOP 中为数不多的真正合法的用途之一。你考虑过 AspectJ 吗? - MK.
你需要进行测试。这可能并不比注释所有内容更糟糕。 - MK.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接