目录
- 注解概述
- 内置注解
- 元注解
- 自定义注解
1 注解概述
作用
- 不是程序本身,可对程序作出解释
- 可别其他程序读取(例如编译器)
2 内置注解
见到抛出最常用的三个:
- @Override -- 重写父类方法
- @Deprecated -- 标注为不推荐用法(可用但不推荐)
- @SuppressWarnings("xxx") -- 忽略警告
@SuppressWarnings("xxx")
@SuppressWarnings是带参数的
- ~("all")
- ~("unchecked")
- ~(value = {"unchecked", "depreciation"}) == ~({"unchecked", "depreciation"})
3 元注解
定义:给(自定义)注解作注解的注解,主要用于确定自定义注解的使用范围,文件状态,是否写入JavaDoc,是否继承父类的注解
元注解有4个(重要的是@Target和@Retention):
- @Target
- @Retention
- @Documented
- @Inherited
@Target的三种写法
简化写法的依据:
当你的注解变量是 String value ( 也可以是 int value )时,在注解使用时可以把
@MyAnnotation3(value = "hello")
简化成
@MyAnnotation3("hello")
// 完全写法
@Target(value = ElementType.METHOD)
// 推荐的简便写法
@Target(ElementType.METHOD)
// 多个参数时,用 { , }
@Target({ElementType.TYPE, ElementType.METHOD})
4 自定义注解
定义模板
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotationName{
// ElemType varName() default xxxx;
String value() default "Bonjour";
int age();
}
例程
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
// 注解的参数: 参数类型 + 参数名();
// String name() default "";
String name();
int age() default 0;
int id() default -1;
}
使用例程注解
// 注解可以显示赋值, 如果没有默认值,我们就必须要给注解赋值
@MyAnnotation2(name = "HELLO")
@MyAnnotation3(3)
public void test(){};
分析--这里有三个重点:
- 自定义注解时,把注解当成一个“方法”,里面定义参数的方式有所不同在于参数名后面加()(例如:
int age();
) - 定义变量语句中
String value() default "Bonjour";
后面出现的default "Bonjour"
指的是默认值。当使用注解时,有默认值的注解变量可以不用赋值,没有默认值的变量必须要赋值,否则报错
完整例程
package annotation;
import org.omg.SendingContext.RunTime;
import java.lang.annotation.*;
// 测试元注解
public class Test02 {
@MyAnnotation
public void test(){
}
}
// 自定义一个注解
// Target 表示我们的注解可以用在哪些地方
@Target(value = ElementType.METHOD)
// Retention 表示我们的注解在什么文件格状态下有效
// SOURCE 是指在源码时有效,即还没编译成 .class 文件
// CLASS 是指编译成 .class 文件 有效
// RUNTIME是指一直有效
@Retention(value = RetentionPolicy.RUNTIME)
// Documented 表示将我们定义的注解放进JAVAdoc中
@Documented
// @Inherited 表示继承父类的注解
@Inherited
@interface MyAnnotation{
}
网友评论