При работе с классом отражения и аннотациями я обнаружил, что нет четкого способа ссылки на имя метода безопасным способом компиляции. Я действительно хочу, чтобы иметь возможность ссылаться на метод в аннотации. Может выглядеть примерно так:Java get compile-time safe method name
@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();
}
Кто-нибудь есть какие-либо мысли, комментарии или решение этой проблемы?
Я могу сделать Strings compile безопасным, если вы добавите проверки времени компиляции через [обработку аннотации] (http://hannesdorfmann.com/annotation-processing/annotationprocessing101/), подобную [this here] (http: // thecodersbreakfast.net/index.php?post/2009/07/09/Enforcing-design-rules-with-the-Pluggable-Annotation-Processor). – zapl
К сожалению, нет, нет никакого готового способа сделать это. – chrylis
Приятно, что это решило бы мою проблему. Kinda sucks Мне бы пришлось пройти весь путь до обработки аннотаций, но я думаю, если нет другого решения. Спасибо за советы и ссылки. – Soto