Java注释在注释声明中执行一个方法(用于android)

时间:2011-09-22 10:48:45

标签: java android methods annotations

我对注释术语相当新。 我已经阅读了一些消息来源并得出结论,我没有回答我的问题。 也许我使用错误的搜索来搜索。也许我忽略了,或者我可能只是一无所知......

无论如何这是交易。

我正忙于编写需要“角色验证”的应用程序。

要做到这一点,我想使用注释。

这就是:

@interface Validate (){

}

我的目标是实现以下目标:

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

所以基本上我想在注释中定义方法。 我希望能够致电

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

只有管理员才能输入此方法。否则应生成错误。

所以如果@validate返回true,则应该执行该方法

很抱歉,如果我真的不清楚。我不太确定如何正确地问我想要什么。 所以我希望这些例子讲述这些故事。

希望尽快阅读提示甚至答案。 感谢。

**编辑**

我需要强调代码必须在Android应用程序上使用的事实。 所以我更喜欢不使用不适合android的奇怪框架。我没有问题添加一个自定义库,它提供了没有任何应用程序框架的功能。

3 个答案:

答案 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>

设置load time weaving

在春天的背景下:

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

之类的内容进行检查。
相关问题