Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找出调用我的方法_Java_Reflection - Fatal编程技术网

Java 找出调用我的方法

Java 找出调用我的方法,java,reflection,Java,Reflection,我试图找到一种方法来获取调用我的完整方法签名 例如: 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) { ne

我试图找到一种方法来获取调用我的完整方法签名

例如:

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只返回“run”作为方法名


你们知道我可以通过其他方式获得完整的方法签名,比如run(java.lang.String)?

你们可以使用AspectJ创建一个方面,它将应用于每个方法调用,并将被调用方法的详细信息添加到每个线程堆栈中,然后在方法完成后将其删除。当然,这将是非常昂贵的。很可能你不想那样做。你也不想扔东西来找出是谁打电话给你的

基本上,你问题的答案是:不要这样做。 解释你为什么认为你想这样做,别人会给你一个好的选择。


另外,仔细想想,您可以认为方法重载(而不是重写!)是有害的。您真的需要具有不同参数和相同名称的多个不同方法吗?

为此您需要调试api。您还可以使用字节码工具根据行号查找方法。为什么需要这样做?也许这可以帮助您:没有注释的向下投票是粗鲁的。好的,让我更好地解释一下为什么我需要知道哪个方法是调用方:假设我已经用一些信息对每个方法进行了注释,这些信息是我在特定的处理时间内需要检索的注释为cod=2。在这种情况下,我怎么知道应该假设哪个cod值,因为我无法区分调用方的run和run(String)?关于MK指向的有害重载,我不能允许用户做这样的事情(这是我们工作中的框架的一部分)。我感谢迄今为止所有的建议/帮助。谢谢各位。我仍然不太明白为什么你们需要知道是谁打电话给你们,但不能要求通过另一个论点?好吧,让我们更深入一点。。。当我的系统加载时,所有注释都缓存在一个散列中(key=methodsignature,value=annotation values),以提高性能,避免始终出现反射。这些注释用于为每个方法设置一些日志信息。这就是为什么我需要知道谁是调用方方法,然后在哈希缓存上搜索其元数据。我可以使用一个额外的参数或类似的东西来获取这样的日志数据,但这更优雅/简单,用户只需做一个注释(优雅,不简单):)谢谢,伙计!嗯,当你听到“日志记录”时,它总是表明这可能是AOP为数不多的真正合法用途之一。你考虑过AspectJ吗?