Подтвердить что ты не робот

Аннотации Java выполняют метод в объявлении аннотации (использование для android)

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

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

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

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

Итак, что-то по линии:

@interface Validate (){

}

То, к чему я стремлюсь достичь, является следующим:

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

@Retention(RetentionPolicy.RUNTIME) 
public @interface Validate() {
}

Ответ 2

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

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

@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>

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

В контексте spring:

<context:load-time-weaver/> 

Убедитесь, что spring -агент запускается с вашим приложением:

java -javaagent:/path/to/spring-agent.jar -classpath $CP your.package.MyApp

Ответ 3

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