簡體   English   中英

Java注釋在注釋聲明中執行一個方法(用於android)

[英]Java annotation execute a method within the annotation declaration(usage for android)

我對注釋術語相當新。 我已經閱讀了一些消息來源並得出結論,我沒有回答我的問題。 也許我使用錯誤的搜索來搜索。 也許我忽略了,或者我可能只是無能為力..

無論如何這里是交易。

我正在忙着編寫一個需要“角色驗證”的應用程序。

為此,我想使用注釋。

所以有以下幾點:

@interface Validate (){

}

我的目標是實現以下目標:

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

所以基本上我想在注釋中定義方法。 我希望能夠打電話

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

只有管​​理員才能輸入此方法。 否則應生成錯誤。

因此,如果@validate返回true,則應執行該方法

對不起,如果我真的不清楚。 我不太確定如何正確地問我想要什么。 所以我希望這些例子講述這些故事。

希望盡快閱讀提示甚至答案。 謝謝。

**編輯**

我需要強調的是,代碼必須在Android應用程序上使用。 所以我更喜歡不使用不適合android的奇怪框架。 我沒有問題添加一個自定義庫,它提供了沒有任何應用程序框架的功能。

注釋是元數據。 您需要編寫的是注釋處理器。 注釋本身無法完成驗證邏輯。 注釋處理器將查看注釋,然后執行驗證並控制應用程序流。 這個SO答案有一個很好的解釋Java Java Annotations可以幫助我嗎?

您還需要使用@Retention(RetentionPolicy.RUNTIME)注釋注釋,以便保留注釋信息直到運行時。

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

請注意,這可能是非常偏離主題的。 使用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

我不認為你可以單獨使用注釋來實現這一點。 它們旨在提供有關代碼元素的元信息,而不是處理邏輯。 要實際實現對帶注釋的方法調用的限制,您需要在方法內部或外部手動檢查訪問權限,或者使用類似http://www.eclipse.org/aspectj/的內容注入此類檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM