簡體   English   中英

創建我自己的注釋Java

[英]Create my own Annotation Java

這是我第一次創建Annotation Java,並且想創建自己的注釋,然后在必要時禁止執行測試。 問題是我很多測試都必須使用Facebook api,有時它們無法正常工作,因此我想要一個名為@Facebook的注釋,將其添加到測試中時可以用作@Suppress注釋,因此編寫了以下代碼。 。不幸的是,它不起作用。 有人可以幫助我嗎?

        @Retention(RetentionPolicy.RUNTIME)
        public @interface Facebook {
            Suppress notToBeRun() default @Suppress;
        }

Java包含靈活的注釋API,具有多種應用程序可能性。 注釋接口最初開發用於在Java EE堆棧中指定企業語義(Java Bean是無狀態的還是有狀態的,單例的,等等),現在,注釋接口也已在Java中普遍用於上下文依賴注入(CDI)。 您的問題解決了如何將Java注解API用於CDI。

首先,您需要為要Java注入的每個特定用戶定義的CDI選項定義一個限定符接口類。 您希望通過注入方式來加載Facebook實現。 您的界面( Facebook.java )如下所示:

@Qualifier
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Facebook {
}

第一個術語@Qualifier表示您定義了一個新的限定符,實際上是Java注入機制已知的唯一名稱( @Facebook )。

@Target注釋表示您的注釋可以位於Java類型聲明,Java字段(特別是變量聲明)或方法參數之前。 您可以添加第四個限定符,以允許在方法(即ElementType.METHOD之前使用注釋。

@Documented定義一個注釋,以確保使用該注釋的類在其生成的JavaDoc中顯示此注釋。 必須將@Retention設置為RetentionPolicy.RUNTIME ,以便在啟動Java應用程序(在Web應用程序服務器上下文中部署)時使注釋變為活動狀態。

現在,您需要定義一個通用的Java接口類( SocialMediaService.java ),只是一個普通的Java接口:

public interface SocialMediaService {
   boolean login(String userId, String password);
   void logout();
   String searchForMessages(String[] friends);
}

該接口可以通過implements Java構造以不同的方式implements 使用先前定義的注釋,您可以在Java代碼中選擇使用哪個替代實現。

這是Java類的Facebook示例(與上面指定的接口限定符類不同的包中的Facebook.java ):

@Facebook
public class Facebook implements SocialMediaService {

   @Override
   public boolean login(String userId, String password) {
       ...
       your application logic
       ...
       return true;
   }
   @Override
   public void logout() {
       ...
       your application logic
       ...
   }
   @Override
   public String searchForMessages(String[] friends) {
       ...
       your application logic
       ...
       return searchResult;
   }  
}

您可以在眾多不同的實現@LinkedIn等中進行選擇,每種實現@LinkedIn其特定的Java實現類( public class Facebook替代public class Facebook )。

現在,您可以在Java類中使用CDI注入所選的Java實現。

應用了CDI的后端Java Bean( BackendSocialMediaAnalysis.java ):

public class BackendSocialMediaAnalysis {
   ...
   @Inject @Facebook
   private SocialMediaService genericMediaService;
   ...
}

@Facebook替換@Facebook @LinkedIn導致將替代(LinkedIn)實現加載到genericMediaService中。

暫無
暫無

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

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