Java аннотации выполнить метод в объявлении аннотации (использование для Android) - PullRequest
14 голосов
/ 22 сентября 2011

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

В любом случае, вот сделка.

Я занят написанием приложения, которое требует "проверки роли".

Для этого я хочу использовать аннотацию.

Так что-то вроде:

@interface Validate (){

}

Я стремлюсь достичь чего-то вроде:

public @interface Validate() {
   public Validate() {
      //Do validation stuff
     return true/false
   }
}

Так что в основном я хочу определить методы в аннотации. Я хочу иметь возможность звонить

@Validate
public void methodThatRequiresAdminRole() {
  doStuff();
}

Только администраторы могут быть в состоянии ввести этот метод. В противном случае должна быть сгенерирована ошибка.

поэтому, если @validate возвращает true, метод должен быть выполнен

Извините, если я действительно неясен. Я не совсем уверен, как правильно спросить, чего я хочу. Поэтому я надеюсь, что примеры рассказывают истории.

Надеюсь прочитать советы и, возможно, даже ответ в ближайшее время. Спасибо.

** РЕДАКТИРОВАТЬ **

Мне нужно подчеркнуть тот факт, что код должен использоваться в приложении для Android. Поэтому я предпочитаю не использовать странные рамки, не предназначенные для Android. У меня нет проблем с добавлением пользовательской библиотеки, которая дает функциональность без какой-либо прикладной инфраструктуры.

Ответы [ 3 ]

20 голосов
/ 22 сентября 2011

Аннотации являются метаданными. Вам нужно написать обработчик аннотаций. Сама аннотация не может выполнить логику проверки. Обработчик аннотаций просматривает аннотации, а затем выполняет валидацию и контролирует поток приложения. Этот SO-ответ имеет хорошее объяснение Могут ли аннотации Java помочь мне в этом?

Также необходимо аннотировать аннотацию с помощью @Retention (RetentionPolicy.RUNTIME), чтобы информация аннотации сохранялась до времени выполнения.

@Retention(RetentionPolicy.RUNTIME) 
public @interface Validate() {
}
2 голосов
/ 22 сентября 2011

Обратите внимание, это может быть не по теме. Используя spring AOP with, обработка комментариев довольно проста:

Создать аспект:

@Aspect
public class RoleCheckAspect {
  @Before("@annotation(your.package.Validate)")
  public void doAccessCheck() throws Exception {
    // Do validation stuff
    if (!valid)
      throw new IllegalAccessException("foo");
    }
  }
}

Настройте свой аспект:

В META-INF / aop.xml

<!DOCTYPE aspectj PUBLIC
  "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
  <weaver>
    <!-- only weave classes in our application-specific packages -->
    <include within="your.package..*" />
  </weaver>
  <aspects>
    <!-- weave in just this aspect -->
    <aspect name="com.bac.bsl.nonproc.TestAspect" />
  </aspects>
</aspectj>

Настройка Плетение времени загрузки

В контексте весны:

<context:load-time-weaver/> 

Убедитесь, что Spring-Agent запущен в вашем приложении:

java -javaagent:/path/to/spring-agent.jar -classpath $CP your.package.MyApp
0 голосов
/ 22 сентября 2011

Я не думаю, что вы можете достичь этого только с помощью аннотаций. Они предназначены для предоставления метаинформации об элементах кода, а не логики обработки. Чтобы реально реализовать ограничение на вызов аннотированных методов, вам нужно будет проверить доступ вручную внутри или снаружи метода или ввести такую ​​проверку, используя что-то вроде http://www.eclipse.org/aspectj/

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