Annotation注解
Annotation注解,也翻译为注释,但是他与之前学过的注释不一样,它是代码中的特殊标记,这些标记是可以在编译、类加载、运行时被读取,并且执行相应的处理,他可用于类、构造方法、成员变量、方法、参数等声明中。
可以分为内置注解和自定义注解
内置注解
@Override:限定重写父类的方法
@Deprecated:表示已过时
@SupressWarnings:抑制编译器报告警告
自定义注解
常用的元注解
(1)@Decumented:指示某一类型的注释通过javadoc和类似的默认工具进行文档化
(2)@Inherited:指示注释类型被自动继承
(3)@Retention:指示注释类型的注释要保留多久
(4)@Target:指示注释类型所适用的程序元素的种类
上述四个元注解会经常用到@Target和@Retention
@Target通过ElementType枚举来设置
ANNOTTION_TYPE :表示Annotation类型
TYPE :表示用于类、接口、枚举、Annotation类型
CONSTRUCTOR:表示用于构造方法
FIELD:表示用于成员变量和枚举变量
METHOD:表示用于方法
PARAMETER :表示用于参数
LOCAL_VARIABLE:表示用于局部变量
PACKAGE:用于包
@Retention通过RetentionPlicy枚举来设置
SOURCE:表示不编译到class文件中
CLASS:表示编译到class文件中
RUNTIEM:表示加载到JVM中
案例
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Price {
double value() default 0.0;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Address {
String value() default "";
String name() default "";
}
public class Watermelon {
@Address(name = "好西瓜")
private String name;
@Address("日本北海道")
private String address;
@Price(23.6)
private double price;
@Override
public String toString() {
return "Watermetlon [address=" + address + ", name=" + name
+ ", price=" + price + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
public class TestWatermelon {
public static void main(String[] args) {
Watermelon watermelon = new Watermelon();
Class waClass = watermelon.getClass();//获得watermeton class
//获得全部属性包括注解
Field[] fields = waClass.getDeclaredFields();
for(Field field : fields){
if(field.isAnnotationPresent(Address.class)){//判断该注解是否在该字段上
Address address = field.getAnnotation(Address.class);//获得该注释上的注解
if("address".equals(field.getName())){
watermelon.setAddress(address.value());
}else if("name".equals(field.getName())){
watermelon.setName(address.name());
}
}else if(field.isAnnotationPresent(Price.class)){
Price price = field.getAnnotation(Price.class);
watermelon.setPrice(price.value());
}
}
System.out.println(watermelon);
}
}
运行结果:
Watermetlon [address=日本北海道, name=好西瓜, price=23.6]