Java注解和反射01:注解


什么是注解

注解不是程序本身,可以对程序作出解释(这点和注释一样)

注解以“@注解名”的形式存在,可以附加在package、class、method、field上,可以通过反射机制编程实现对这些元数据的访问可以被其他程序(比如编译器)读取

内置注解

@Override、@Deprecated

@SuppressWarnings,用来抑制编译时的警告信息,需要传入一个参数

元注解

元注解的作用是注解其他注解,Java定义了4个标准元注解

@Target,用于描述注解的使用范围

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

@Documented,说明该注解将被包含在javadoc中

@Inherited,说明子类可以继承父类中的该注解

自定义注解

如果只有一个参数,名字一般为value,这样可以直接写值

返回值类型就是参数的类型(只能是基本类型Class、String、enum)

注解参数必须要有值,可以通过default来声明参数的默认值

import java.lang.annotation.*;

/**
 * @Target()指定注解的使用范围
 * @Retention()指定注解的生效周期
 * @Documented表示将注解生成在javadoc中
 * @Inherited表示子类可以继承该注解
 */
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited

/**
 * @interface自定义注解
 */
@interface MyAnnotation{
    
    /**
     * 定义参数:参数类型 参数名() default 值
     * 如果值为-1说明不存在
     */
    String name();
    int age() default 0;
    int id() default -1;

    String[] title();
}

@interface MyAnnotation2{
    
    String value();
}

/**
 * 如果注解参数设置了默认值可以不用写
 */
@MyAnnotation(name = "ty", title = {"student", "son"})
@MyAnnotation2("ty")
class test{}