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

Posted

技术标签:

【中文标题】Java注解在注解声明中执行一个方法(用于android)【英文标题】:Java annotation execute a method within the annotation declaration(usage for android) 【发布时间】:2011-11-22 17:38:28 【问题描述】:

我对注释术语相当陌生。 我已经阅读了一些资料并得出结论,非回答我的问题。 也许我使用错误的搜索进行了谷歌搜索。也许我忽略了,或者也许我只是一无所知..

无论如何,这是交易。

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

为此,我想使用注释。

所以大致如下:

@interface Validate ()


我的目标是:

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

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

@Validate
public void methodThatRequiresAdminRole() 
  doStuff();

只有管理员才能进入此方法。否则会产生错误。

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

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

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

** 编辑 **

我需要强调代码必须在 android 应用程序上使用这一事实。 所以我宁愿不使用不适合安卓的奇怪框架。添加一个无需任何类型的应用程序框架即可提供功能的自定义库没有问题。

【问题讨论】:

【参考方案1】:

注解是元数据。您需要编写的是注释处理器。注释本身无法完成验证逻辑。注释处理器将查看注释,然后进行验证并控制应用程序流程。这个 SO 答案有一个很好的解释Can Java Annotations help me with this?

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

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

【讨论】:

感谢您的建议以及链接。我知道下一步该做什么。所以我帮忙了。 不客气。查看此链接以及简单注释处理器 horstmann.com/corejava/cj7v2ch13ex.pdf 的实现。【参考方案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

【讨论】:

【参考方案3】:

我认为您无法仅通过注释来实现这一点。它们旨在提供有关代码元素而不是处理逻辑的元信息。 要实际实现对带注释的方法调用的限制,您需要在方法内部或外部手动检查访问,或者使用 http://www.eclipse.org/aspectj/ 之类的东西注入这样的检查

【讨论】:

如果您熟悉 .NET。我正在寻找我曾经/确信这正是注释的“属性”。在这种情况下我会错吗?我刚想到它。谢谢你的回答顺便说一句。它看起来确实无法实现。我会让几分钟过去,看看会弹出什么答案。否则我会标记这个。 @Joey AspectJ 可用于 android 开发,但仅限于使用编译时编织,这意味着您只能控制您拥有源代码的方法的执行。 @Joey 是的,Java 注释等同于 .NET 属性。您可以向方法添加注释,这些注释可以包含数据,但不能包含在方法调用上执行的处理逻辑。这更多是 AOP 术语中所谓的方面的关注。 我正在使用 PlayFramework,它有一个注释 @Secured,它将检查 cookie 是否存在,然后在会话缓存中验证该 cookie 以便可以完成。我不太确定,因为我似乎看不到他们在 scala 中是如何做到的,但我确信它可以在没有 AspectJ 的情况下执行

以上是关于Java注解在注解声明中执行一个方法(用于android)的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么获取注解中value的值

了解Java中的注解

了解Java中的注解

java注解设置字段不能为零

java元注解 @Target注解用法

java注解自定义使用