【问题标题】:Java get compile-time safe method nameJava获取编译时安全方法名
【发布时间】:2016-03-11 08:18:02
【问题描述】:

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

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

有没有人对此有任何想法、cmets 或解决方案?

【问题讨论】:

标签: java reflection annotations metaprogramming compile-time


【解决方案1】:

我写了一个AnnotationProcessor,它可以提供一个编译安全的方法参考。 See it on github

如果引用的方法不存在,会报错。

它在 Eclipse 中工作,请参阅快照。

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 2016-12-06
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多