廖雪峰Java4反射与泛型-2注解-2定义注解

1.定义注解

使用@interface定义注解Annotation

  • 注解的参数类似无参数方法
  • 可以设定一个默认值(推荐)
  • 把最常用的参数命名为value(推荐)

2.元注解

2.1Target使用方式

使用@Target定义Annotation可以被应用于源码的那些位置

  • 类或接口:ElementType.TYPE
  • 字段:ElementType.FIELD
  • 方法:ElementType.METHOD
  • 构造方法:ElementType.CONSTRUCTOR
  • 方法参数:ElementType.PARAMETER
@Target({ElementType.METHOD,ElementType.FIELD})//可以传入1个或数组
    public @interface Report{
        int type() default 0;//设定默认值
        String level() default "info";
        String value() default "";//把最常用的参数命名为value
    }

2.2Retention生命周期

使用@Retention定义Annotation的声明周期:
仅编译期:Retention.SOURCE,编译器在编译时直接丢弃,不会保存到class文件中
仅class文件: Retention.CLASS,该Annotation仅存储在class文件中,不会被读取
运行期:Retention.RUNTIME,在运行期可以读取该Annotation
如果@Retention不存在,则该Annotation默认为CLASS,通常自定义的Annotation都是RUNTIME。

    @Retention(RetentionPolicy.RUNTIME)
    public @interface Report{
        int type() default 0;//设定默认值
        String level() default "info";
        String value() default "";//把最常用的参数命名为value
    }

2.3Repeatable可重复

使用@Repeatable定义Annotation是否可重复 JDK >= 1.8
Reports.java

package com.testAnno;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

//用于存储的容器注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Reports {
	Report[] value();	
}

Report.java

package com.testAnno;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

//创建可重复注解
@Repeatable(Reports.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface Report {
//	String value();
	String info();
	int type();
}

TestMyReport.java

package com.testAnno;

public class TestMyReport {
	@Report(value="1")
	public void repeatble1() {}
	@Report("3")
	@Report("2")
	public void repeatable2() {}
	
}

https://jingyan.baidu.com/article/a3761b2bf05f661576f9aaf3.html

2.4使用@Inherited定义子类是否可继承父类定义的Annotation

  • 仅针对@Target为TYPE类型的Annotation
  • 仅针对class的继承
  • 对interface的继承无效
package com.reflection;
import java.lang.annotation.*;

@Inherited
@Target(ElementType.TYPE)
public @interface Report{
    int type() default 0;
    String level() default "info";
    String value() default "";
}
@Report(type=1)
class Person1{

}
class Student1 extends Person1{}

3.定义Annotation

步骤:

  • 1.用@interface定义注解
  • 2.用元注解(meta annotation)配置注解
    * Target:必须设置
    * Retention:一般设置为RUNTIME
    * 通常不必写@Inherited,@Repeatable等等
  • 3.定义注解参数和默认值
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Report{
    int type() default 0;
    String level() default "info";
    String value() default "";
}

4.总结:

  • 使用@interface定义注解
  • 可定义多个参数和默认值,核心参数使用value名称
  • 必须设置@Target来指定Annotation可以应用的范围
posted on 2019-02-19 19:57  singleSpace  阅读(163)  评论(0编辑  收藏  举报