Аннотации 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. У меня нет проблем с добавлением настраиваемой библиотеки, которая предоставляет функциональные возможности без какой-либо рамок приложения.
Ответы
Ответ 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/