Java:注解Annotation

注解Annotation

注解的概念

  • JDK5.0 中引入
  • Annotation的作用:
    • 不是程序本身,可以对程序做出解释(与注释comment相似)
    • 可以被其他程序(如编译器)读取
  • Annotation的格式:
    • @注释名,还可以添加一些参数值,如@SuppressWarnings(value="unchecked")
  • 使用位置:
    • 可以在package, class, method, field等位置,相当于添加了额外的辅助信息,可以通过反射机制编程实现访问

注解具有检查和约束的功能

public class Test01{
    //重写的注解
    @Override
    public String toString() {
        return super.toString();
    }
}

内置注解

  • @Override:定义在java.lang.Override中,只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法
  • @Deprecaated:定义在java.lang.Deprecated中,可用于修饰方法、属性、类。表示不鼓励使用这样的元素,已过时的(通常是不安全或有更好的选择)
  • @SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息,需要添加参数才能使用,使用之后不会提出警告
    • @SuppressWarnings("all")
    • @SuppressWarnings("unchecked")
    • @SuppressWarnings(value={"unchecked","deprecation"})
    • ……

元注解(用于描述自定义注解)

  • 元注解:用于注解其他注解,属于java.lang.annotation
    • @Target:用于描述注解的适用范围(可以使用在什么地方
    • @Retention:表示需要在声明级别保存该注解信息,用于描述注解的生命周期
      • SOURCE < CLASS < RUNTIME:一般都定义RUNTIME
    • @Document:说明该注解将被包含在javadoc中
    • @Inherited:说明子类可以继承父类中的该注解
@MyAnnotation	//自定义注解可以在类中使用
public class Test02 {
}

//定义一个注解,参数查看源码

//Target 表示注解可以用在什么地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})

//Retention 表示注解在什么地方有效,一般使用RUNTIME>CLASS>SOURCE
@Retention(value = RetentionPolicy.RUNTIME)

//Documented 表示是否将注解生成在Javadoc中
@Documented

//Inherited 子类可以继承父类的注解
@Inherited
//注解的定义
@interface MyAnnotation{
    
}

自定义注解

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

  • (public) @interface 注解名 {定义内容}:自定义注解
  • 注解中的方法实际上是用于声明配置参数
  • 方法的名称是参数的名称
  • 返回值的类型是参数的类型(返回值只能是基本类型,class,String,enum)
  • 可以通过default声明参数的默认值
  • 如果只有一个参数成员,一般参数名为value,使用时可以省略
  • 注解元素必须有值,定义时常用空字符串、0作为默认值
public class Test03 {
    //注解可以显示赋值,如果没有默认值,就必须给注解赋值
    @MyAnnotation2(name = "chachan53")
    public void test(){}
}

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
    //注解的参数:参数类型 + 参数名();
    String name() default "";
    int age() default 0;
    int id() default -1;//如果默认值为-1,代表不存在
    String[] schools() default {"A","B"};
}

只有一个参数成员时:

public class Test03 {
    //注解可以显示赋值,如果没有默认值,就必须给注解赋值
    @MyAnnotation3("test1")
    public void test2(){}
}

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
    String value();
}
posted @ 2022-04-19 11:39  chachan53  阅读(26)  评论(0编辑  收藏  举报