廖雪峰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可以应用的范围
廖雪峰Java4反射与泛型-2注解-2定义注解的更多相关文章
- 廖雪峰Java4反射与泛型-2注解-1使用注解
1.Annotation定义 注解是放在Java源码的类.方法.字段.参数前的一种标签.如下 package com.reflection; import org.apache.logging.log ...
- 廖雪峰Java4反射与泛型-3范型-3编写泛型
编写泛型类比普通的类要麻烦,而且很少编写泛型类. 1.编写一个泛型类: 按照某种类型(例如String)编写类 标记所有的特定类型例如String 把特定类型替换为T,并申明 Pair.java pa ...
- 廖雪峰Java4反射与泛型-2注解-3处理注解
1.处理注解 注解本身对对代码逻辑没有任何影响 SOURCE类型的注解在编译期就被丢掉了 CLASS类型的注解仅保存在class文件中 RUNTIME类型的注解在运行期可以被读取 如何使用注解由工具决 ...
- 廖雪峰Java4反射与泛型-3泛型-7泛型和反射
1.部分反射API是泛型 1.1获取反射API的泛型 部分反射API是泛型,如Class<T>是泛型 //如果使用Class,不带泛型,出现compile warning编译警告 Clas ...
- 廖雪峰Java4反射与泛型-3范型-4擦拭法
1.擦拭法是Java泛型的实现方式. 编译器把类型视为Object. * 泛型代码编译的时候,编译器实际上把所有的泛型类型T统一视为Object类型.换句话说,虚拟机对泛型一无所知,所有的工作都是编译 ...
- 廖雪峰Java4反射与泛型-3范型-6super通配符
1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pai ...
- 廖雪峰Java4反射与泛型-3范型-5extends通配符
1.泛型的继承关系: Pair<Integer>不是Pair<Number>的子类 add()不接受Pair<Integer> Pair.java package ...
- 廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method
2.字段Field 2.1.通过Class实例获取字段field信息: getField(name): 获取某个public的field,包括父类 getDeclaredField(name): 获取 ...
- 廖雪峰Java4反射与泛型-1反射-1Class类
1.Class类与反射定义 Class类本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建了唯一的Class实例. Class实例包 ...
随机推荐
- 2017.5.11 MapReduce运行机制
和HDFS一样,MapReduce也是采用Master/Slave的架构 MapReduce1包含4个部分:Client.JobTracker.TaskTracker和Task Client 将JAR ...
- Chrome程序及数据位置变更到非系统盘
Chrome浏览器在Windows系统上安装过程,没有设置安装位置的步骤,所以默认是安装在C盘的.并且,若Chrome作为主要浏览器使用,随着时间的积累,数据文件会非常多.增加系统盘的负荷. Wind ...
- acm 2032
////////////////////////////////////////////////////////////////////////////////#include<iostream ...
- SQL Server 向数据库中创建表并添加数据
创建表,展开数据库中新建的数据库,下面有一个选项-表.在该选项上右键就可以选择-新建-表. 然后出现的界面上是需要自己填写列列名.数据类型和选择是否允许空值. 其中数据类型我是参考: http://w ...
- day39Python
1.Python简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它 ...
- dive 方便的观察容器各层信息的工具
dive 是一个方便的观察容器各层信息的工具,同时也集成了容器构建命令,方便我们在构建容器 镜像的同时查询镜像各层的变动信息 安装 mac 系统,可以按照自己的系统选择安装方式 wget http ...
- UML异步怎么表达
直接看结果 第一虚框和第二虚框是异步的.m1 和m2 没有任何先后关系. 第一虚框和第二虚框是异步的,两者没有任何先后关系.m3和m4是有先后关系的.m3()比m4()先执行.同样m5()和m6().
- Serv-U设置被动模式(FTP工具)
FTP服务器在公司内网,通过端口映射把21端口映射出去. 公司一些机器也在各个省的机房内网.好在这些机器可以访问公网.由于各个地区的机器托管在各个地区机房. 我有公司防火墙的权限,可以做防火墙上做端口 ...
- taro 开发注意点
taro 开发注意点: 注意点 原因 如果要支持 React Native 端,必须采用 Flex 布局,并且样式选择器仅支持类选择器,且不支持 组合器 Taro RN 端是基于 Expo,因此不支持 ...
- Linux 下的三种时间介绍
Linux 下的三种时间介绍: Access Time:简写为atime,表示文件访问的时间,当文件内容被访问时,更新atime时间 Modify Time:简写为mtime,表示文件内容修改的时间, ...