2012-04-05 38 views
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只返回“run”作为方法名称。

你们是否知道其他方式在那里我能得到这样的运行(java.lang.String中)的完整方法签名?

+0

您需要调试api。您也可以使用字节码工具根据行号查找方法。 – biziclop 2012-04-05 18:44:26

+0

为什么你需要这样做? – Jeffrey 2012-04-05 18:49:00

+0

也许这可以帮助你:http://stackoverflow.com/questions/421280/in-java-how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection – SWoeste 2012-04-05 18:56:52

回答

1

您可以用AspectJ创建方法完成后,将适用于每一个方法调用,并添加有关该方法的细节被调用到每线程栈,然后取出它的一个方面。当然,这将会非常昂贵。很可能你不想这样做。你也不想扔什么东西来找出谁叫你。

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

而且,想起来了,你可以争辩说,方法重载(不重写!)被认为是有害的。你是否真的需要多种不同的参数和相同的名称?

+0

+ 1的建议_不做这个._ – 2012-04-05 18:48:01

+0

Downvoting w/oa评论是粗鲁的。 – 2012-04-05 22:32:14

+0

OK,让我解释一下为什么好我需要知道哪些方法是调用一个:假设我已经标注了一些资料,我需要在我遇到processing.Suppose一定时间()注释为鳕鱼以检索每个方法= 1和运行(字符串arg)注释为cod = 2.在这种情况下,我怎么能知道哪个是我应该假设的cod值,因为我无法区分run(run)和caller?关于有害超载MK point到,我不能probit用户做这样的事情(这是我工作中的框架的一部分)。到目前为止,我总结了所有的帮助/帮助。多谢你们。 – RLM 2012-04-09 19:53:16