这是我第一次创建Annotation Java并且我想创建一个自己的注释,然后在必要时禁止执行测试。 问题是我的许多测试我必须使用Facebook api,有时它们不起作用所以我想要一个名为@Facebook的注释,当添加到测试时作为@Suppress注释工作,所以我写了下面的代码..不幸的是,这不起作用。有人可以帮帮我吗?
@Retention(RetentionPolicy.RUNTIME)
public @interface Facebook {
Suppress notToBeRun() default @Suppress;
}
答案 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。