注解

注解

什么是注解

  • 注解是从JDK5.0开始引入的新技术
  • 注解的作用:
  1. 与注释作用相同,可以对程序做出解释

  2. 可以被其他程序(如编译器)读取

  • 注解的格式:以“@注释名”在代码中存在,还可以添加一些参数值
  • 注解的应用范围:可以附加在package,class,method,field等上面,相当于给它们添加了额外的辅助信息,可以通过反射机制编程实现对这些元素的访问

内置注解

  • @Override:只是用于修辞方法,表示一个方法声明打算重写超类中的另一个声明
  • @Deprecated:可以用于修辞方法,属性,类,表示不建议使用
  • @SuppressWarnings:用来抑制编译时的警告信息。需要添加参数
package annotation;

//抑制编译警告
@SuppressWarnings("all")
public class Test01 {
    //重写的注解,有检查功能
    @Override
    public String toString() {
        return "Test01{}";
    }
    //不推荐程序员使用,
    @Deprecated
    public static void test(){}

    public static void main(String[] args) {

    }
}


元注解

  • 元注解的作用:负责注解其他的注解
  • 元注解的种类:
  1. @Target:用于描述注解的使用范围

  2. @Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE < ClASS < RUNTIME)

  3. @Document:说明该注解将被包含在JavaDoc中

  4. @Inherited:说明子类可以继承父类中的注解

package annotation;

import java.lang.annotation.*;

//测试元注解
public class Test02 {
    @MyAnnotation
    public static void test(){}

    public static void main(String[] args) {
        test();
    }
}

//定义一个注解
//Target:表示注解可以用在那些地方
@Target(value = {ElementType.METHOD, ElementType.TYPE})
//Retention 表示注解在什么地方有效
@Retention(value = RetentionPolicy.RUNTIME)
//表示是否将注解生成到JavaDoc中
@Documented
//Inherited 子类继承父类的注解
@Inherited
@interface MyAnnotation{

}

自定义注解

  • 使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口
  • 特点:
  1. public @interface注解名{定义内容}

  2. 其中的每一个方法实际上是声明了一个配置参数

  3. 方法的名称就是参数的名称

  4. 返回值类型就是参数的类型,返回值只能是基本类型

  5. 可以通过default来声明参数的默认值

  6. 如果只有一个参数成员,一般参数名为value,传参时可以不写参数名

  7. 注解元素必须要有值,定义注解元素时,经常使用空字符串,0为默认值

package annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//自定义注解

public class Test03 {
    //注解可以有默认值,如果没有默认值,必须给注解赋值
    @MyAnnotation2(name = "sml", schools = {"大连理工大学"})
    public static void test2(){}

    @MyAnnotation3("sml")
    public static void test3(){

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

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
    String value();
}
原文地址:https://www.cnblogs.com/happysml/p/13871440.html