2016-02-22 3 views
1

Я пишу простое приложение. Я не хочу использовать какие-либо фреймворки. Пожалуйста, предложите мне подходящее место для обработки аннотаций.Где подходящее место для обработки аннотаций?

У меня есть несколько строк в main метода:

String myString = (@NonNull String)list; 

И я создал @interface:

@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 
public @interface NonNull { 
} 

Какой шаг я должен предпринять дальше? Могу ли я работать с аннотациями без использования рефлексии? Не могли бы вы предоставить мне образцы такого кода обработки аннотаций?

+0

Следующий шаг - создать обработчик аннотации. Взгляните [здесь] (http://programmaticallyspeaking.com/playing-with-java-annotation-processing.html) и [здесь] (http://www.javacodegeeks.com/2012/08/java-annotations- explored-explain.html), чтобы узнать, как это сделать. – aribeiro

ответ

1

Невозможно (AFAIK) работать с аннотациями без отражения.

Если вы не хотите использовать какую-либо фреймворк, первым шагом будет написать класс прокси-класса, обрабатывающий запросы метода. Это пример обработки методом с использованием аннотаций по методу:

public class MyProxy { 
     private <T> T getProxy(T t) { 
     return (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), new Class<?>[]{MyClass.class}, new MyInvocationHandler(t)); 
    } 
} 

А затем реализовать InvocationHandler:

public class MyInvocationHandler implements InvocationHandler { 

     private Object obj; 

     MyInvocationHandler (Object obj) { 
      this.obj = obj; 
     } 

     @Override 
     public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable { 
      boolean isNotNull = method.isAnnotationPresent(NotNull.class); 

      if (isNotNull) { 
    /* process annotated method. Or go through proxy object fields etc.. */ 

      } 
     } 
} 

Я надеюсь, что это поможет.

0

Вы не сказали, какую обработку аннотации вы хотите сделать.

Вы хотите добавить проверку времени выполнения, которая приведет к сбою вашего кода, если list всегда имеет значение null во время выполнения? Для этого рефлексия будет работать.

Вы хотите добавить проверку времени компиляции, которая отклонит ваш код, если он не сможет доказать, что list никогда не является нулевым во время выполнения? Для этого обработчик аннотации, такой как Checker Framework, будет работать.

Ваш вопрос не объясняет, почему вы не хотите использовать фреймворк. Это позволит вам избавить вас от повторной реализации множества функций, которые другие уже создали.

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