add by zhj: 使用@Repeatable的注解,隻有在定義時需要指定@Repeatable的參數,注解容器,即下面的Skills。在使用注解時,并不會用到注解容器。
是以我建議使Programmer類那種注解方法,更簡潔,而不建議使用Waiter類那種注解方式。
原文作者:lvbinbin2yujie
原文連結:https://www.cnblogs.com/lvbinbin2yujie/p/10291602.html
檢視@PropertySource注解時候,發現了@Repeatable,從來沒見過的注解,學習了下;
首先介紹下@Repeatable注解: JDK1.8出現的,作用是解決一個類上不能标注重複的注解;

@Repeatable相當于指向一個容器,這樣就可以在注解的地方重複标注注解了;
簡單的使用例子,友善自己了解:
定義這樣一個場景,每個人有不同的技能,不同職業的人又有不同的技能;
定義一個注解代表擁有的技能;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Documented
@Retention(RUNTIME) //運作時注解
@Target(TYPE) //類上的注解
@Repeatable(Skills.class)
public @interface Skill {
String value() default "";
}
容器注解Skills
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface Skills {
Skill[] value();
}
定義這樣一個人的接口
@Skill(value="吃飯")
@Skill(value="睡覺")
public interface Human {
}
定義了兩個人的具體實作,展示了Skills的兩種不同使用方式;
@Skill("程式設計")
@Skill("打遊戲")
public class Programmer implements Human{
}
@Skills({@Skill("迎賓"),@Skill("上菜")})
public class Waiter implements Human {
}
測試類:
public class Main {
public static void main(String[] args) {
Human man = new Programmer();
// Human man = new Waiter();
List<Class> classes = new ArrayList<>();
classes.addAll(Arrays.asList(man.getClass().getInterfaces()));
classes.add(man.getClass());
for (Class<?> clazz : classes) {
Skill[] skills = clazz.getAnnotationsByType(Skill.class);
for (Skill skill : skills) {
System.out.println("他會:" + skill.value());
}
}
}
}