Java如何获取编译时安全的方法名

4

在使用反射类和注解时,我发现没有一种明确的方式可以以编译时安全的方式引用方法名。我真正想要的是能够在注解中引用一个方法。可能看起来像这样:

@CallAfter(method=Foo.class.foo())
void Bar() { ... }

目前只能使用字符串来实现此功能,这不是编译时安全的。这是一个问题,因为它破坏了Java的静态类型。我发现的唯一解决方案就像下面所示。然而,这仍然无法帮助在注释中引用方法。 :(

public static String methodName = null;

public static void main(String[] args) {

    // .foo() is compile-time safe
    loadMethodName(IFoo.class).foo();
    System.out.println(methodName);
}

public static <T> T loadMethodName(Class<T> mock) {
    return (T) Proxy.newProxyInstance(mock.getClassLoader(), new Class[] { mock }, 
    (obj, method, args) -> {
        methodName = method.getName();
        return null;
    });
}

public interface IFoo {
    Object foo();
}

有人对此有何想法、评论或解决方案吗?


如果您通过注解处理添加编译时检查,类似于这里,则可以使字符串在编译时安全。 - zapl
很遗憾,目前没有现成的方法可以做到这一点。 - chrylis -cautiouslyoptimistic-
太好了,这将解决我的问题。有点糟糕的是我得去进行注解处理,但嘿,如果没有其他解决方案的话,我想也只能如此了。感谢你的建议和提供的链接。 - Soto
1个回答

2

我编写了一个AnnotationProcessor,可以提供编译安全的方法引用。 在Github上查看

如果引用的方法不存在,它将会产生编译错误。

而且它在eclipse中工作,可以看到截图。

eclipse-use


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