元注解:jdk提供的注解,用来修饰自定义的注解
1.元注解之@Target
作用:指明此注解用在哪个位置,如果不写默认是任何地方都可以使用。
@Target注解的属性:ElementType[] value
ElementType是一个枚举: 枚举名.变量名
TYPE: 用在类,接口上
FIELD:用在成员变量上
METHOD: 用在方法上
PARAMETER:用在参数上
CONSTRUCTOR:用在构造方法上
LOCAL_VARIABLE:用在局部变量上
2.元注解之@Retention
作用:定义该注解的生命周期(有效范围)。不写默认值CLASS(.java,.class)
@Retention注解的属性:RetentionPolicy value
RetentionPolicy是一个枚举:
SOURCE:注解只存在于Java源代码中,编译生成的字节码文件(class文件)中就不存在了。
CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有,默认值。
RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过反射获取该注解。
定义元注解:
package com.ccc.demo07Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})//声明注解的使用位置:成员方法上,类/接口上
@Retention(RetentionPolicy.CLASS)
public @interface Book {
//书名
public abstract String value();
//价格,默认值为 100
public abstract double price() default 100;
//多位作者
public abstract String[] authors();
}
使用元注解:
package com.ccc.demo07Annotation;
@Book(value = "老王",authors = "老王")
public class UseBook {
private String name;
public UseBook(String name) {
this.name = name;
}
@Book(value = "老王",authors = "老王")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}