【问题标题】:How do I get the method name at compile time?如何在编译时获取方法名称?
【发布时间】:2015-04-17 14:27:53
【问题描述】:

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

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

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

可能有人在不更改MN常量的情况下更改方法名称,然后我在日志中找不到。

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

显然宏是不好的做法,但我认为这对它们来说是一个很好的用例。这就是我的基本目标,类似于宏、常量。

顺便说一句,这个问题很相似:

Getting the name of the current executing method

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


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

请不要给出“Java 就是这样设计的”之类的琐碎回答,因为那样我只会问“为什么?”

【问题讨论】:

  • 什么方法名?请更清楚地解释您要完成的工作。 (答案可能是你需要使用 Java 8 方法句柄。)
  • 如果你使用日志框架,那么捕获方法名已经被处理了。
  • 我不认为这是一个骗局,我正在寻找一个编译时解决方案,但该解决方案中没有提到
  • 不能在编译时完成。

标签: java reflection macros compile-time


【解决方案1】:

来自https://stackoverflow.com/a/5891326/4353712的回答:

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

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

【讨论】:

    【解决方案2】:

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

    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();
        }
    }
    

    【讨论】:

    • 这怎么比他的解决方案好?您仍然需要手动输入方法名称...
    • 来自 java 文档,getEnclosureMethod() - 如果此 Class 对象表示方法中的本地或匿名类,则返回一个 Method 对象,表示底层类的直接封闭方法。因此,根据我的理解,这仅在方法中存在类时才有效。对于我的解决方案,您必须输入方法名称,但您会得到一个完全限定的名称作为回报。如果您想即时获取方法的名称,那么我认为这是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 2012-03-27
    • 2014-07-23
    • 1970-01-01
    • 2016-12-06
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多