注解,和comment(注释)很像,前者是给机器看,后者是给人看的。
元注解的作用就是负责解释其他注解。java定义了4个标准(meta-annotation)
- Target 用于描述注解的使用范围(字段,方法,类名)
- Retention (注释的生命周期, 源代码 < class文件 < 运行期(runtime,常用)
- Documented (是否将该注解包含在javadoc中)
- inherited 说明子类继承父类?
在@Target中传入一个参数 value = {enum ElementType},在ElementType中有8个枚举,来觉得这个自定义注解能用在哪些地方。比如value中添加Method,则就用在方法上,要是没有添加 type 则不能添加到类名。
操作如下:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Myann //这里则会报错 因为没有添加ElementType.TYPE
public class Myannotation {
@Myann
public void test(){
}
}
// 照猫画虎的自定义注解即可。
@Target(value = {ElementType.METHOD})
@interface Myann{
}
而在指定Retention中时,直接传入value ,右键+Ctrl,能看到value是由RetentionPolicy修饰的,而RetentionPolicy本身是一个枚举类型.
有三种类型,SOURCE (源代码)< CLASS (类文件)< RUNTIME (运行态)。通常来说,自定义的注解中Retention都是置为Runtime状态。
操作代码:
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@interface Myann{
}
完整版代码如下:
import java.lang.annotation.*;
public class Myannotation {
@Myann(value = "woshi", vv = "")
public void test(){
}
}
// 照猫画虎的自定义注解即可。
@Inherited
@Documented
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@interface Myann{
//参数类型 参数名() default ;
// default 用来指定 value的默认值的
// 若注解的参数只有一个且为value,那在传参时,可以省略不写value
String value() default "";
String vv(); //定义了就一定要在使用注解时,传入参数。
String[] schools() default{"西部开源","清华大学"};
}