如何在编译时获取方法名称?

时间:2015-02-16 23:37:10

标签: java reflection macros compile-time

如何在编译时获取封闭方法名称?

为什么我很难弄清楚这一点?为什么Java不希望我这样做?我没有看到像这样的功能的任何固有问题,并且它对于记录方法名称而不重复方法签名和字符串常量非常有用,如下所示:

private void methodName() {
   final String MN = "methodName";
   ...

有人可能会更改方法名称而不更改MN常量,然后我在日志中找不到它。

我知道Java有一个(反射?)方法可以做到这一点,但是为什么有人想要过度复杂化并使用运行时解决方案(针对这个特定问题)创建错误的可能性超出了我。< / p>

显然宏是不好的做法,但我认为这对他们来说是一个非常好的用例。这就是我基本上要做的事情,比如宏,常量。

不过,这个问题很相似:

Getting the name of the current executing method

但是,没有一个解决方案是在编译时派生的常量。它们都是运行时计算。


编辑:为什么不能在编译时完成?

请不要给出一个简单的答案,例如“这就是Java的设计方式”,因为那时我只会问“为什么?”

2 个答案:

答案 0 :(得分:2)

从答案https://stackoverflow.com/a/5891326/4353712

String name = new Object(){}.getClass().getEnclosingMethod().getName();

但是,正如答案中所提到的,每次使用时都会生成一个新的.class文件。

答案 1 :(得分:0)

不是在编译时,但仍然可能适合你:

public class test1 {
    public void display() {
        try {
            final String s = this.getClass().getMethod("display",null).toString();
            System.out.println(s);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }
    public static void main(String args[]) { 
        test1 obj = new test1();
        obj.display();
    }
}