Java 注解】自定义注解 ( 注解属性定义与赋值 )

网友投稿 1070 2022-05-30

文章目录

一、自定义注解格式

二、注解本质分析

三、注解属性及类型

四、注解属性类型

五、注解属性赋值简化操作

一、自定义注解格式

分析 Java 中自带的 @Override 注解 , 源码如下 :

@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }

1

2

3

4

注解分为两部分 :

① 元注解 ;

② public @interface 注解名称 ;

二、注解本质分析

按照 public @interface 注解名称 格式 , 写出一个注解 , 编译该注解代码生成 Annotation.class 字节码文件 ;

public @interface Annotation { }

1

2

使用 javap 命令反编译Annotation.class 字节码文件 , 查看该注解的实际代码 ;

反编译命令如下 :

javap Annotation.class

1

输出内容 :

D:

D:\002_Project\004_Java_Learn\Annotation\out\production\Annotation>javap Annotation.class Compiled from "Annotation.java" public interface Annotation extends java.lang.annotation.Annotation { }

2_Project

D:\002_Project\004_Java_Learn\Annotation\out\production\Annotation>javap Annotation.class Compiled from "Annotation.java" public interface Annotation extends java.lang.annotation.Annotation { }

4_Java_Learn\Annotation\out\production\Annotation>javap Annotation.class Compiled from "Annotation.java" public interface Annotation extends java.lang.annotation.Annotation { }

1

2

3

4

注解的本质是一个 interface 接口 , 注解接口默认继承了 java.lang.annotation.Annotation 接口 ;

public interface Annotation extends java.lang.annotation.Annotation { }

1

2

三、注解属性及类型

注解的本质是接口 , 接口中可以定义

常量

方法 ;

在注解中定义

接口方法

, 就是

注解的属性 ;

为注解添加属性 : 接口中的方法都是抽象方法 , 其中 public abstract 可以省略 ;

public @interface Annotation { public abstract String path(); }

1

2

3

注解属性使用格式 :

@注解名称(属性名称 = 属性值)

1

注解属性使用 : 在相关的代码上使用

@Annotation(path = "") Student(String name, int age){ }

1

2

3

四、注解属性类型

注解属性 ( 接口方法 ) 返回值类型要求 :

基本数据类型

: byte , short , int , long , float , double , char , boolean ;

字符串类型

: String ;

枚举类型

: enum ;

注解类型 ;

以上类型的数组形式 ;

注解属性返回值必须是以上的类型 , 不能设置其它类型返回值 , 否则会报错 ;

注解中定义了属性 , 在使用注解时 , 需要 给

注解属性

赋值 ;

定义 注解属性 时 , 可以

使用 default 关键字 指定属性默认值

, 下面代码中 , 制定 注解属性 intValue 值类型为 int 整型 , 默认值 88 ;

int intValue() default 88;

1

如果

注解属性 指定了默认值

, 在使用注解时 , 可以选择

不为该属性赋值 ( 此时使用默认属性值 )

,

也可以进行赋值 ( 指定一个新的属性值 ) ;

如果

注解属性 没有指定默认值

, 则使用 注解 时 ,

必须为其指定一个默认值 ,

否则编译时报错 ;

数组类型 的 注解属性 赋值

【Java 注解】自定义注解 ( 注解属性定义与赋值 )

时 , 使用大括号进行赋值 , 大括号内是数组元素 , 如果只有一个属性 , 可以省略大括号 ,

注解 声明示例 :

public @interface Annotation { /** * 字符串类型 * @return */ String stringValue(); /** * int 基本类型 * @return */ int intValue() default 88; /** * 枚举类型 * @return */ Number enumValue(); /** * 注解类型 * @return */ Annotation2 annotationValue(); /** * 字符串数组类型 * @return */ String[] stringArrayValue(); }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

枚举类 :

public enum Number { ONE, TWO, THREE }

1

2

3

Annotation2 注解类 :

public @interface Annotation2 { }

1

2

注解使用示例 :

/** * 注解生成文档 * * @author hsl * @version 0.1 * @since 1.5 */ public class Student { /** * 构造函数 * @param name 参数一 * @param age 参数二 */ @Annotation( stringValue = "tom", enumValue = Number.ONE, annotationValue = @Annotation2, stringArrayValue = {"tom", "jerry"}) Student(String name, int age){ } @SuppressWarnings("all") @Override public String toString() { return super.toString(); } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

代码分析 : 重点关注注解的使用 , 使用注解时 , 需要给 没有默认值 的 注解属性 赋值 , 格式为 注解属性名称 = 对应类型属性值 , 如果 注解属性 有默认值 , 则

@Annotation(stringValue = "tom", enumValue = Number.ONE, stringArrayValue = {"tom", "jerry"})

1

五、注解属性赋值简化操作

如果

注解属性 名称是 value

, 并且

注解中只有 1 1 1 个属性

, 那么在使用 注解 为 注解属性 赋值时 , 可以省略注解名称 , 直接传入 注解属性值 ;

示例 : JDK 自带的 SuppressWarnings 注解 ,

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }

1

2

3

4

5

注解使用 : 使用 SuppressWarnings 注解时 , 直接传入 “all” 参数 , 省略了注解属性名称 ;

@SuppressWarnings("all") @Override public String toString() { return super.toString(); }

1

2

3

4

5

满足两个条件 , 才能使用上述简化方式 ;

Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Qt-QML-ComboBox-自定义,实现状态表示,内容可以动态正价,使用ListModel
下一篇:【RecyclerView】 四、RecyclerView 布局 ( 网格局管理器 GridLayoutManager )
相关文章