Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java注释在注释声明中执行方法(用于android)_Java_Android_Methods_Annotations - Fatal编程技术网

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

Java注释在注释声明中执行方法(用于android),java,android,methods,annotations,Java,Android,Methods,Annotations,我对注释术语相当陌生。 我阅读了一些资料,得出结论,non回答了我的问题。 也许我用谷歌搜索错了。也许我忽略了,也许我只是不知所措 不管怎么说,事情是这样的 我正忙于编写一个需要“角色验证”的应用程序 为此,我想使用注释 因此,大致如下: @interface Validate (){ } 我的目标是实现以下几点: public @interface Validate() { public Validate() { //Do validation stuff re

我对注释术语相当陌生。 我阅读了一些资料,得出结论,non回答了我的问题。 也许我用谷歌搜索错了。也许我忽略了,也许我只是不知所措

不管怎么说,事情是这样的

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

为此,我想使用注释

因此,大致如下:

@interface Validate (){

}
我的目标是实现以下几点:

public @interface Validate() {
   public Validate() {
      //Do validation stuff
     return true/false
   }
}
所以基本上我想在注释中定义方法。 我想打个电话

@Validate
public void methodThatRequiresAdminRole() {
  doStuff();
}
只有管理员才能输入此方法。否则将生成一个错误

因此,如果@validate返回true,则应该执行该方法

对不起,如果我真的不清楚。我不太清楚如何恰当地问我想要什么。 因此,我希望这些例子能够讲述故事

希望很快能看到一些提示,甚至是答案。 谢谢

**编辑**

我需要强调的是,这些代码必须在android应用程序上使用。
所以我不喜欢使用不适合android的奇怪框架。我可以添加一个自定义库,在没有任何应用程序框架的情况下提供功能。

我认为单靠注释是无法实现这一点的。它们旨在提供有关代码元素的元信息,而不是处理逻辑。
要真正实现对带注释的方法调用的限制,您需要在方法内部或外部手动检查访问权限,或者使用类似于“注释是元数据”的内容插入这样的检查。您需要编写的是注释处理器。注释本身无法完成验证逻辑。注释处理器将查看注释,然后进行验证并控制应用程序流。这个答案有很好的解释

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

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

注意,这可能有点离题。使用with,处理注释相当简单:

创建一个方面:

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

以防您熟悉.NET。我正在寻找“属性”,我确信这正是注释的含义。在这种情况下我会错吗?我突然想到了。谢谢你的回答,顺便说一句。看起来这是不可能实现的。我会让几分钟过去,看看会弹出什么答案。否则我将对此进行标记。@Joey AspectJ可用于android开发,但它仅限于使用编译时编织,这意味着您只能控制源代码所针对的方法的执行。@Joey Yes Java注释等同于.NET属性。您可以向方法添加注释,这些注释可以包含数据,但不能处理在方法调用上执行的逻辑。这更多的是AOP术语中所谓的方面的问题。我使用的是PlayFramework,它有一个注释@Secured,该注释将检查cookie是否存在,然后在会话缓存中验证cookie,以便执行。我不是很确定,因为我似乎看不出他们在scala中是如何做到的,但我确信它可以在没有AspectJ的情况下执行感谢您的建议以及链接。我知道下一步该怎么做。所以我帮了你,不客气。查看此链接,了解简单注释处理器的实现。
<context:load-time-weaver/> 
java -javaagent:/path/to/spring-agent.jar -classpath $CP your.package.MyApp