2015-12-06 8 views
4

При работе с классом отражения и аннотациями я обнаружил, что нет четкого способа ссылки на имя метода безопасным способом компиляции. Я действительно хочу, чтобы иметь возможность ссылаться на метод в аннотации. Может выглядеть примерно так: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(); 
} 

Кто-нибудь есть какие-либо мысли, комментарии или решение этой проблемы?

+0

Я могу сделать 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

+0

К сожалению, нет, нет никакого готового способа сделать это. – chrylis

+0

Приятно, что это решило бы мою проблему. Kinda sucks Мне бы пришлось пройти весь путь до обработки аннотаций, но я думаю, если нет другого решения. Спасибо за советы и ссылки. – Soto

ответ

1

я пишу AnnotationProcessor, который может обеспечить компиляции безопасным методом. See it on github

Это даст ошибка компиляции, если ссылки метод не существует.

И это работает в затмении, увидеть снимок.

 Смежные вопросы

  • Нет связанных вопросов^_^