注解

1.什么是注解

1.1注解入门

注解起源

annotation 从JDK5.0开始引入

注释和注解

comment 注释

  • 不是程序本身,给人解释程序

annotation 注解

  • 不是程序本身,可以对程序作出解释
  • 可以被其他程序(编译器)读取,通过反射读取
注解的格式

@注释名 可以添加参数值

@SuppressWarnings(value="unchecked")

@Deprecated 已废弃的,可以写在不推荐使用的方法前

注解在哪里使用

可以添加在package,class,method,field等上面,相当于添加了额外的信息

通过反射机制进行编程来实现对这些元数据的访问

代码
public class Test01 extends Object{
    //重写的注解
    @Override
    Public String toString{ //注解有检查的约束,如果上面的toString写的与父类不一致就会报错
        return super.toString();
    }
}

1.2内置注解

三个内置注解

以下三个注解定义在java.lang下,例如@Override在java.lang.Override以此类推。

  • @Override - 检查该方法是否是重写方法,没有重写会报编译错误。只适用于修饰方法。
  • @Deprecated - 标记过时方法,不鼓励程序员使用,因为危险或存在更好的选择。如果使用该方法,会报编译警告。可以用来修饰方法,属性,类。
  • @SuppressWarnings - 指示编译器去忽略注解中声明的警告。该注释需要添加参数。
    • @SuppressWarnings("all")
    • @SuppressWarnings("unchecked")
    • @SuppressWarnings(value={"unchecked","deprecation"})
    • ......

1.3元注解,自定义注解

元注解

meta-annotation 元注解:负责注解其他注解。可以在java.lang.annotation包中找到下面4个类型和它们做支持的类。

  • @Target - 描述注解的使用范围(注解可以用在什么地方)
  • @Retention - 表示需要在什么样的级别保存该注解信息,描述注解的生命周期(SOURCE<CLASS<RUNTIME) 常用
  • @Documented - 标记这些注解是否包含在用户文档中。
  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类) 子类可以继承父类的该注解
自定义注解
  • 使用@interface来声明注解 格式public @interface 注解名 {注解内容}
  • 其中的每一个方法其实是声明了一个配置参数
  • 方法的名称就是参数的名称
  • 返回值的类型就是参数的类型 返回值只能是基本类型class,String,enum
  • 可以通过default来声明默认的参数值
  • 如果只有一个参数,一般参数名为value
  • 注解元素必须要有值,我们定义注解时一般使用空字符串或0作为默认值
@ MyAnnotation
public class Test02{
    
    public test(){
        
    }
}
//定义注解
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface MyAnnotation{
    //仅使用元注解配置
}
代码
public class Test03 {
    //注解可以显示赋值,如果没有默认值,就必须赋值
    @MyAnnotation2(name = "李华")
    public void test(){

    }
    // 只有一个参数且名为value时可以省略参数名
    @MyAnnotation3("李华")
    public void test2(){

    }
}

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
    //这是注解的参数 格式:参数类型 + 参数名 + ();
    String name() default "";
    String[] schools() default {""};
}

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
    //如果只有一个参数,建议使用value
    String value();
}
原文地址:https://www.cnblogs.com/programthinking/p/13791675.html