注解与自定义注解

注解与自定义注解1 注解注解很厉害 它可以增强我们的 java 代码 同时利用反射技术可以扩充实现很多功能 它们被广泛应用于三大框架底层 传统我们通过 xml 文本文件声明方式 如下图 但是 XML 比较繁琐且不易检查 而现在最主流的开发都是基于注解方式 代码量少 框架可以根据注解去自动生成很多代码 从而减少代码量 程序更易读 例如最火爆的 SpringBoot 就完全基于注解技术实现 注解设计非常精巧 初学时觉得很另类甚至多余 甚至垃圾 有了 java 代码干嘛还要有 注解呢 但熟练之后你会赞叹 它竟然可以超越 java 代码的功能

1 注解

2 注解的分类

注解一共分为3大类,我们先来认识一下:

  • JDK自带注解
  • 元注解
  • 自定义注解

2.1 JDK注解

JDK注解的注解,就5个:

@Override :用来标识重写方法

2.2 元注解

用来描述注解的注解,就5个:

@Target 注解用在哪里:类上、方法上、属性上等等
@Retention 注解的生命周期:源文件中、字节码文件中、运行中

2.2.1 @Target ElementType…

描述注解存在的位置:

ElementType.TYPE 应用于类的元素
ElementType.METHOD 应用于方法级
ElementType.FIELD 应用于字段或属性(成员变量)
ElementType.ANNOTATION_TYPE 应用于注解类型
ElementType.CONSTRUCTOR 应用于构造函数
ElementType.LOCAL_VARIABLE 应用于局部变量
ElementType.PACKAGE 应用于包声明
ElementType.PARAMETER 应用于方法的参数

2.2.2 @Retention RetentionPolicy…

SOURCE 在源文件中有效(即源文件保留)
CLASS 在class文件中有效(即class保留)
RUNTIME 在运行时有效(即运行时保留)

3 自定义注解

注意:注解的语法写法和常规java的语法写法不同

创建包: cn.tedu. annotation
创建类: TestAnnotation.java

package cn.tedu.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /*本类用于完成自定义注解*/ public class TestAnnotation { 
    } //2.通过@Target注解标记自定义注解的使用位置 /*3.通过元注解@Target规定自定义注解可以使用的位置 * 我们使用"ElementType.静态常量"的方式来指定自定义注解具体可以加在什么位置 * 而且,值可以写多个,格式:@Target({ElementType.XXX,ElementType.XXX}*/ @Target({ 
   ElementType.METHOD,ElementType.TYPE})//可以加在方法&类上 //3.通过@Retention注解标记自定义注解的生命周期 /*4.通过元注解@Retention规则自定义注解的生命周期 * 我们使用"RetentionPolicy.静态常量"的方式来指定自定义注解的生命周期 * 注意:值只能写一个:SOURCE CLASS RUNTIME 3选1 */ @Retention(RetentionPolicy.RUNTIME)//到运行时都有效 //1.定义自定义注解 /*1.首先注意:注解定义的语法与Java不同 * 2.定义自定义注解的格式:@interface 注解名*/ @interface Rice{ 
    //5.我们可以给注解进行功能增强--添加注解的属性 /*5.注意:int age();不是方法的定义,而是给自定义注解添加了一个age属性*/ //int age();//给自定义注解添加一个普通属性age,类型是int int age() default 0;//给自定义注解的普通属性赋予默认值0 /*6.注解中还可以添加特殊属性value * 特殊属性的定义方式与普通属性一样,主要是使用方式不同 * 注意:特殊属性的名字必须叫value,但是类型不做限制 * 特殊属性也可以赋予默认值,格式与普通属性一样,不能简写 * */ //String value();//定义一个特殊属性value,类型是String String value() default "Lemon";//定义特殊属性并给特殊属性赋予默认值 } //4.定义一个类用来测试自定义注解 //@Rice class TestAnno{ 
    /*测试1:分别给TestAnno类 name属性 eat方法都添加Rice注解 * 结论:属性上的注解报错了,说明自定义注解可以加在什么位置,由@Target决定*/ //@Rice//报错了 String name; /*测试2:当我们给Rice注解添加了一个age属性以后,@Rice注解使用时直接报错 * 结论:当注解没有定义属性时,可以直接使用 * 当注解定义了属性以后,必须给属性赋值,格式:@Rice(age = 10)*/ /*测试3:给age属性赋予默认值以后,可以直接使用@Rice注解 * 不需要给age属性赋值,因为age属性已经有默认值0了*/ /*测试4:给Rice注解添加了特殊属性value以后,必须给属性赋值 * 只不过特殊属性赋值时可以简写成 @Rice("Apple") * 测试5:如果特殊属性也赋予了默认值,那么可以直接使用这个注解 * 如果要给注解的所有属性赋值,每条赋值都不能简写*/ @Rice(age=10,value="orange") //@Rice("Apple") //@Rice(age = 10) //@Rice(10)//报错,不可以简写,普通属性没有这种格式 public void eat(){ 
    System.out.println("干饭不积极,思想有问题"); } } 

恭喜你,又闯过一关,后续框架部分我们会频繁使用注解,祝你有个好的开端

下一节 反射 点这里

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221190.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午6:42
下一篇 2026年3月17日 下午6:43


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号