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可以应用的范围

廖雪峰Java4反射与泛型-2注解-2定义注解的更多相关文章

  1. 廖雪峰Java4反射与泛型-2注解-1使用注解

    1.Annotation定义 注解是放在Java源码的类.方法.字段.参数前的一种标签.如下 package com.reflection; import org.apache.logging.log ...

  2. 廖雪峰Java4反射与泛型-3范型-3编写泛型

    编写泛型类比普通的类要麻烦,而且很少编写泛型类. 1.编写一个泛型类: 按照某种类型(例如String)编写类 标记所有的特定类型例如String 把特定类型替换为T,并申明 Pair.java pa ...

  3. 廖雪峰Java4反射与泛型-2注解-3处理注解

    1.处理注解 注解本身对对代码逻辑没有任何影响 SOURCE类型的注解在编译期就被丢掉了 CLASS类型的注解仅保存在class文件中 RUNTIME类型的注解在运行期可以被读取 如何使用注解由工具决 ...

  4. 廖雪峰Java4反射与泛型-3泛型-7泛型和反射

    1.部分反射API是泛型 1.1获取反射API的泛型 部分反射API是泛型,如Class<T>是泛型 //如果使用Class,不带泛型,出现compile warning编译警告 Clas ...

  5. 廖雪峰Java4反射与泛型-3范型-4擦拭法

    1.擦拭法是Java泛型的实现方式. 编译器把类型视为Object. * 泛型代码编译的时候,编译器实际上把所有的泛型类型T统一视为Object类型.换句话说,虚拟机对泛型一无所知,所有的工作都是编译 ...

  6. 廖雪峰Java4反射与泛型-3范型-6super通配符

    1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pai ...

  7. 廖雪峰Java4反射与泛型-3范型-5extends通配符

    1.泛型的继承关系: Pair<Integer>不是Pair<Number>的子类 add()不接受Pair<Integer> Pair.java package ...

  8. 廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method

    2.字段Field 2.1.通过Class实例获取字段field信息: getField(name): 获取某个public的field,包括父类 getDeclaredField(name): 获取 ...

  9. 廖雪峰Java4反射与泛型-1反射-1Class类

    1.Class类与反射定义 Class类本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建了唯一的Class实例. Class实例包 ...

随机推荐

  1. [ZOJ 4062][2018ICPC青岛站][Plants vs. Zombies]

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4062 题目大意:给一个大小为n的数组,数组编号从1到n,每一个元素的值代表 ...

  2. Go Example--原子计数器

    package main import ( "fmt" "runtime" "sync/atomic" "time" ) ...

  3. MVVM在WPF中应用(1)

    在软件行业浸润了这么多年,第一次在MES的工厂里从事软件开发. 在这里的感觉就是安静.宽松,比在那些专门以软件为主的企业中轻松自在.在这里的第一个项目是关于数据的导入和导出,还有数据的比较这些功能. ...

  4. day39KNN算法和其他的算法

    PS: 1.现在明白为什么其他的同学一直都在做数字图像处理,matlab这种东西了,因为机器学习,其他底层主要是做预先处理,然后调用某一个算法 2.感觉knn算法就是根据先验数据计算下一个跟自己一样不 ...

  5. SQL Server 表分区备忘

    1.创建的代码如下: )) AS RANGE LEFT FOR VALUES ( N', N', N',... ) CREATE PARTITION SCHEME [01_SubjectiveScor ...

  6. django+uwsgi+nginx数据表过大引起"out of memory for query result"

    昨天负责的一个项目突然爆“out of memory for query result”. 背景 项目的数据表是保存超过10m的文本数据,通过json方式保存进postgres中,上传一个13m的大文 ...

  7. centos 7.0 lnmp成功安装过程

    下载nginx,wget 是一个下载命令-c 是断点续传(不要也这个也可以) [root@bogon ~]# wget -c http://nginx.org/download/nginx-1.7.9 ...

  8. Scalable MySQL Cluster with Master-Slave Replication, ProxySQL Load Balancing and Orchestrator

    MySQL is one of the most popular open-source relational databases, used by lots of projects around t ...

  9. About the test in development

    Unit test: Specify and test one point of the contract of single method of a class. This should have ...

  10. C# WinForm 菜单项的大小、高宽的手动控制

    控制菜单项的第一级的下级菜单项的大小: 直接通过(ContextMenuStrip对象).AutoSize = false.(ContextMenuStrip对象).Size = new Size(5 ...