【发布时间】: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 或解决方案?
【问题讨论】:
-
如果您通过annotation processing 添加编译时间检查,类似于this here,您可以使字符串编译时间安全。
-
很遗憾,不,没有开箱即用的方法可以做到这一点。
-
很好,这可以解决我的问题。有点糟糕,我不得不一直进行注释处理,但是嘿,我想如果没有其他解决方案。感谢您的建议和链接。
标签: java reflection annotations metaprogramming compile-time