我对注释术语相当新。 我已经阅读了一些消息来源并得出结论,我没有回答我的问题。 也许我使用错误的搜索来搜索。也许我忽略了,或者我可能只是一无所知......
无论如何这是交易。
我正忙于编写需要“角色验证”的应用程序。
要做到这一点,我想使用注释。
这就是:
@interface Validate (){
}
我的目标是实现以下目标:
public @interface Validate() {
public Validate() {
//Do validation stuff
return true/false
}
}
所以基本上我想在注释中定义方法。 我希望能够致电
@Validate
public void methodThatRequiresAdminRole() {
doStuff();
}
只有管理员才能输入此方法。否则应生成错误。
所以如果@validate返回true,则应该执行该方法
很抱歉,如果我真的不清楚。我不太确定如何正确地问我想要什么。 所以我希望这些例子讲述这些故事。
希望尽快阅读提示甚至答案。 感谢。
**编辑**
我需要强调代码必须在Android应用程序上使用的事实。 所以我更喜欢不使用不适合android的奇怪框架。我没有问题添加一个自定义库,它提供了没有任何应用程序框架的功能。
答案 0 :(得分:20)
注释是元数据。您需要编写的是注释处理器。注释本身无法完成验证逻辑。注释处理器将查看注释,然后执行验证并控制应用程序流。这个SO答案有一个很好的解释Can Java Annotations help me with this?
您还需要使用@Retention(RetentionPolicy.RUNTIME)注释注释,以便保留注释信息直到运行时。
@Retention(RetentionPolicy.RUNTIME)
public @interface Validate() {
}
答案 1 :(得分: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>
在春天的背景下:
<context:load-time-weaver/>
确保使用您的应用启动spring-agent:
java -javaagent:/path/to/spring-agent.jar -classpath $CP your.package.MyApp
答案 2 :(得分:0)
我认为你不能单独用注释来达到这个目的。它们旨在提供有关代码元素的元信息,而不是处理逻辑。 要实际实现对带注释的方法调用的限制,您需要在方法内部或外部手动检查访问权限,或使用http://www.eclipse.org/aspectj/
之类的内容进行检查。