17--API-注解

注解

1.什么是注解

注解 (英文名Annotation)

是从JDK5.0开始引入的一个新的技术.

注解的作用:

不是程序本身,可以对程序作出解释
可以被其他程序读取(比如:编辑器)

注解的格式:

注解是以"@注解名"在代码中存在的,还可以添加一些参数值
例如;`@SuppressWarnings(value="unchecked")

注解适用于哪里?

可以附加在package , class, method , field等上面,相当于给他们添加了额外的辅助信息
我们可以通过反射机制编程实现对这些元数据的访问.

2. 内置注解

  • @Override注解定义在java.lang.Override 中, 此注解用于修辞方法, 表示一个方法声明打算重写超类(父类)中的方法
  • @Deprecated 注解定义在java.lang.Deprecated 中, 此注解用于修辞方法, 属性, 类. 表示不鼓励程序员去使用, 通常是因为它可能存在危险或者存在更好的选择
  • @SuppressWarnings 定义在java.lang.SuppressWarnings 中, 用来抑制编译时的警告信息

3. 元注解

元注解的作用就是负责注释其他注解,java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明.

//测试元注解
@Liq
public class Test02 {
    public  void test(){
    }
}
//定义一个注解
//Target表示我们的注解可以用在哪些地方
@Target(value={ElementType.METHOD,ElementType.TYPE})
//Retention表示我们的注解在什么地方还有效
//runntime > class > sources
@Retention(value = RetentionPolicy.RUNTIME)
//Documented表示我们的注解是否生成在doc中
@Documented
//Inherited 子类可以继承父类的注解
@Inherited
@interface Liq{

}
@Target   ElementType.class
//描述注解的使用范围:
// ElementType.ANNOTATION_TYPE        应用于注释类型
// ElementType.CONSTRUCTOR         应用于构造函数
// ElementType.FIELD                   应用于字段或属性
// ElementType.LOCAL_VARIABLE      应用于局部变量
// ElementType.METHOD              应用于方法级
// ElementType.PACKAGE             应用于包声明
// ElementType.PARAMETER           应用于方法的参数
// ElementType.TYPE                应用于类的元素
@Retention  RetentionPolicy.class
//定义了该注解被保留的时间长短,某些注解仅出现在源代码中,而被编译器丢弃;
//而另一些却被编译在class文件中; 编译在class文件中的注解可能会被虚拟机忽略,而另一些在class被装载时将被读取。
//为何要分有没有呢?没有时,反射就拿不到,从而就无法去识别处理。
// SOURCE        在源文件中有效(即源文件保留)
// CLASS         在class文件中有效(即class保留)
// RUNTIME           在运行时有效(即运行时保留)

4. 自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口

格式:

public @interface 注解名{
定义内容
}

4.1 注解的参数

自定义注解时,可以设置参数. 参数格式为 参数类型 参数名(); 例如: String name(); 在使用时如果没有默认值,则必须传递参数

// 自定义注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface liq{
    // 注解的参数: 参数类型 + 参数名();
    String name();
}

//使用注解
public class test{
    @liq(name = "liq")
    public void test(){}
}

4.2 注解的默认值

如果注解已经自定义了默认值, 参数可以不用写.如下:

//自定义注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface liq{
    //注解的参数:参数类型+参数名(); default为默认值
    String name() default  "";
    int age() default 0;
    int id() default -1;//如果默认值为-1,代表不存在,
    String[] school() default { "河工大","北大"};
}
// 使用注解
public class Test03 {
    // 因为注解里面 已经 有了默认值 default 0; 所以age的属性可写可不写
    //注解可以显示赋值,如果没有默认值,我们就必须给注解赋值
    @liq(name = "李强",school = "河工大")
    public  void test(){ }

4.3 当注解只有一个参数时

如果说注解里只有一个值,建议使用value做参数名, 因为使用value做参数名, 写参数的时候就可以省略参数名

例如:

// 定义注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface  liq2{
    String value();
}

//使用注解
public class test(){
     @liq2("李强")
    public  void test1(){ }
}

posted on 2020-05-24 08:45  liqiangbk  阅读(484)  评论(0编辑  收藏  举报

导航