创建我自己的Annotation Java

时间:2012-11-05 16:35:35

标签: java facebook annotations

这是我第一次创建Annotation Java并且我想创建一个自己的注释,然后在必要时禁止执行测试。 问题是我的许多测试我必须使用Facebook api,有时它们不起作用所以我想要一个名为@Facebook的注释,当添加到测试时作为@Suppress注释工作,所以我写了下面的代码..不幸的是,这不起作用。有人可以帮帮我吗?

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

1 个答案:

答案 0 :(得分:1)

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构造以不同方式实现。 使用先前定义的注释,您可以选择 在Java代码中使用哪种替代实现。

以下是Java类的示例( 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等,每个实现都有其特定的Java实现类(public class Facebook的替代方法)。

在Java类中,您现在可以使用CDI注入所选的Java实现。

应用CDI的后端Java-bean( BackendSocialMediaAnalysis.java ):

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

@Facebook替换@LinkedIn会导致替代(LinkedIn)实施加载到genericMediaService。