前面的注解简介中介绍了怎么定义注解,这里我们就自定义一个注解,让大家看看注解是怎么实现的。
首先定义两个注解,一个是王者,这是是青铜,嘿嘿。
//青铜注解
@Documented //加载到doc文档
@Retention(RetentionPolicy.RUNTIME)//生命周期是运行时
@Target(ElementType.TYPE) //作用域是类
public @interface Bronze {
}
//王者注解
@Documented //加载到doc文档
@Retention(RetentionPolicy.RUNTIME) //生命周期是运行时
@Target(ElementType.TYPE) //作用域是类
public @interface King {
}
我们建立一接口,叫做Player(玩家),然后有个抽象类(abstractPlayer)去实现这个接口
public interface Player {
String getName();
}
public abstract class AbstractPlayer implements Player {
String name;
}
下来用两个具体的类继承抽象类,将抽象方法重写,并将自定义注解加到类头。
@Bronze
public class XiaoHong extends AbstractPlayer {
public String getName() {
return name;
}
private String name ="晓鸿";
}
@King
public class YunZhao extends AbstractPlayer{
public String getName() {
return name;
}
private String name = "我";
}
但这里就给两个玩家贴上了标签,就是加了注解,一个是王者,一个是青铜。
但是对标签的处理是另外实现的,这时候有个某人出现了,你看到了两个玩家,通过查看注解,知道了谁是王者,谁是青铜。
public class SomeBody {
public void isKing(AbstractPlayer abstractPlayer) {
Annotation[] annotations = abstractPlayer.getClass().getAnnotations();
for (int i = 0; i <annotations.length ; i++) {
if (annotations[i].toString().contains("King")) {
System.out.println(abstractPlayer.getName() + "是个王者,太厉害了,啊哈哈!");
}
if (annotations[i].toString().contains("Bronze")) {
System.out.println(abstractPlayer.getName() + "是个青铜,快点上白银!");
}
}
}
}
这时候我就可以在主函数下调用isKing方法,看看谁是青铜,谁是王者,哈哈。
public class Test {
public static void main(String[] args) {
SomeBody someBody = new SomeBody();
someBody.isKing(new XiaoHong());
someBody.isKing(new YunZhao());
}
}
点击运行测试类,最后的运行结果如下:
还是挺有意思的,哈哈,大家好好学习一下哈。