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

2022-09-02 21:19:55

我对注释术语相当陌生。我阅读了一些来源,得出的结论是没有回答我的问题。也许我用谷歌搜索了错误的搜索。也许我忽略了,或者Mayhbe我只是无能为力。

无论如何,这是交易。

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

为此,我想使用注释。

所以有些东西是这样的:

@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注释可以帮助我吗?

您还需要使用@Retention(RetentionPolicy.RUNTIME) 对注释进行批注,以便批注信息一直保留到运行时。

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

答案 2

请注意,这可能非常偏离主题。使用弹簧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/> 

确保弹簧代理已从您的应用程序启动:

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

推荐