Напишите аннотацию, чтобы защитить метод от вызова, когда параметры неверны - PullRequest
1 голос
/ 18 августа 2011

Могу ли я иметь аннотацию для метода, который, когда его параметры нулевые, просто ничего не делает, фактически не вызываясь?

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

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

Вы должны сделать несколько вещей -

Создать интерфейс

public interface IService {

     @ValidateNull // Your custom annotation
     public void yourMethod(String s1);
}

При использовании реализации создайте экземпляр как прокси JDK.

IService myService = (IService)java.lang.Proxy.newInstance(ServiceImpl.class.getClassLoader(),
                           ServiceImpl.class.getInterfaces(), 
                           new YourProxy(new ServiceImpl());

Теперь вы можете с помощью отражения захватить все вызовы вашего метода в YourProxy классе.

 public YourProxy implements InvocationHandler {
public Object invoke(Object arg0, Method method, Object[] args) throws Throwable {
    if (method.isAnnotationPresent(ValidateNull.class)) {
                   //Check args if they are null and return.
            }
     }
 }

Если вы не хотите этого делать, то вам нужны более тяжелые фреймворки, такие как AspectJ / Spring AOP.

3 голосов
/ 18 августа 2011

Аннотации сами по себе - не что иное, как данные. Они ничего не «делают». Существует ряд различных способов создания среды выполнения, которая интерпретирует аннотации и выполняет требуемую функциональность. Наиболее распространенным методом является то, что называется Аспектно-ориентированным программированием, где вы изменяете поведение компонентов программы на основе метаданных.

aspectJ - это полнофункциональная библиотека, которая позволяет вам изменять поведение практически всего! Технически вам даже не понадобится аннотация, которая будет заполнять аспектJ, существует множество различных способов «сопоставить» методы, поведение которых вы хотите изменить.

SpringAOP - это более ограниченное подмножество функций, предоставляемых aspectJ, но, как следствие, его проще использовать и добавлять в ваш проект!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...