收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
但是,仅仅这三个标注是不能满足我们开发时一些需求的。所以java允许我们自定义注解来使用,了解spring boot等框架的同学会发现这些框架普遍且大量地自定义了许多注解并使用。
2 如何自定义注解
自定义步骤大致分为两步:
1.通过@interface关键字(注意,不是interface,是@interface)声明注解名称,并声明注解的成员属性(参数)。
2.使用java内置的四个元注解对这个自定义标注的范围、功能做出一定限制。
那么什么元注解呢?
3.什么是元注解
元注解,所谓元,即是原始的,基础的。元注解是构建注解的基础组成,元注解定义了衍生的注解,包括上述三个提到的注解,它们也是由元注解定义的。
元注解有哪些呢,全部的注解位于java.lang.annotation包下,主要有四个@Target,@Retention,@Documented,@Inherited
- @Target:表名注解用于什么地方,由枚举类ElemenetType指定,详细说明如下:ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明 - @Retention:表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
RetentionPolicy.SOURCE 注解将被编译器丢弃,即编译时忽略。
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃 ,这是默认的级别。
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。 - @Documented:带有此元注解的注解,将会在javadoc或类似工具中生成对应文档记录。
- @Inherited:表示自动继承注解类型,这个元注释只会导致从超类继承注解; 已实现接口上的注解无效。
4 自定义及使用注解示例
自定义一个类级别的注解Description
import java.lang.annotation.*;
@Documented //将此注解包含在javadoc
@Target(ElementType.TYPE) //此注解作用于类
@Retention(RetentionPolicy.RUNTIME) //运行时生效
public @interface Description {
String value();
}
自定义一个字段、方法级别的注解
import java.lang.annotation.*;
@Documented //将此注解包含在javadoc
@Target({ElementType.METHOD, ElementType.FIELD}) //此注解作用于方法,字段
@Retention(RetentionPolicy.RUNTIME) //运行时生效
public @interface Name {
String name();
String description();
}
实现一个实体类,分别使用了类上的@Description、字段和方法上的@Name
@Description也可以写成@Description("测试对应的注释"),因为注解定义的时候其字段为value。而value比较特殊,它在被指定参数的时候可以不用显示的写出来。
@Description(value = "测试对应的注释")
public class Person {
@Name(name = "临地-字段", description = "作用于字段")
private String name1;
public String getName1() throws NoSuchFieldException {
//获取字段name1上的Name注释的name值
return this.getClass().getDeclaredField("name1").getAnnotation(Name.class).name();
}
@Name(name = "临地-方法", description = "作用于方法")
public String getName2() throws NoSuchMethodException {
//获取getName2方法上的Name注释的name值
return this.getClass().getMethod("getName2").getAnnotation(Name.class).name();
}
}
main方法查看对应注解是否起效
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**


**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**