首页 > 编程语言 >[Java基础复习]注解

[Java基础复习]注解

时间:2024-05-18 11:19:59浏览次数:23  
标签:默认值 Java 复习 可以 使用 注解 属性 Retention

一、什么是注解

  1. 注解是JDK1.5才引入的,Java增加了对元数据(描述数据的数据)的支持,也就是注解。
  2. 注解可以标注在类,成员变量,方法、形参上等。
  3. 注解可以做到在不改变代码逻辑的前提下在代码中嵌入补充信息。
  4. 这些信息被保存在注解的“name=value”键值对中。
  5. 框架=反射+注解+设计模式

从JDK5.0开始,Java增加了对元数据的支持,也就是注解。注解其实就是代码中的特殊标记,这些特殊标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,可以做到在不改变代码原有逻辑的情况下,在代码中嵌入一些补充信息。注解可以标注在类,成员变量,方法,形参上等。

二、JDK内置注解

  1. @Deprecated:

    1. 被这个注解标注的元素已过时。
    2. 这个注解是给编译器看的,编译器看到这个注解之后会有警告提示信息。
  2. @Override:

    1. 修饰实例方法,则该方法必须是个重写方法,否则就会编译失败。
  3. @FunctionalInterface:

    1. “函数式接口”的注解,这个是JDK1.8版本引入的特性。使用@FunctionalInterface标注的接口,则该接口就有且只能存在一个抽象方法,否则就会发生编译错误。

三、自定义注解

  1. 使用@interface来定义注解
@元注解
【修饰符】 @interface 注解名 {
	返回值类型 属性名() default 默认值;
}
  1. 默认情况下可以出现在类上、方法上、属性上、构造方法上、方法参数上等
  2. 所有自定义的注解,其父类是:java.lang.annotation.Annotation
  3. 不包含任何元素(或者说属性)的注解称为标记注解

四、注解也可以定义属性

  1. 注解可以定义属性,不过属性定义时,属性名后面必须加一个小括号
  2. 如果这个注解中有属性,那么使用的时候,必须给属性赋值。没有赋值则报错,除非在定义注解的时候给属性指定了默认值。
  3. 怎么给属性赋值? @MyAnnotation(属性名=值, 属性名=值, 属性名=值)
  4. 注解的元素在使用时表现为名-值的形式,并且需要放置在@注解()声明之后的括号内。
  5. 属性的类型只能是:
    1. byte、short、int、long、float、double、boolean、char
    2. String、Class、枚举类型、注解类型
    3. 以上所有类型的一维数组形式
    4. 后面写default,给出默认值,如果没有指定默认值,那么使用该注解时必须通过“方法名=值”的形式进行赋值
    5. 如果是数组,则使用{}进行赋值

五、注解的使用

  1. 注解在使用时必须给属性赋值,除非使用了default关键字为属性指定了默认值
  2. 如果属性只有一个,并且属性名是value时,使用注解时value可以省略不写
  3. 如果属性是一个数组,使用注解时,数组值只有一个,数组的大括号可以省略
  4. 注意:任何非基本类型的元素,无论是在源代码声明时还是在注解接口中定义默认值时,都不能使用null作为其值。这个限制使得处理器很难表现一个元素的存在或者缺失的状态。为了绕开这个约束,可以自定义一些特殊的值,比如空字符串或者负数用于表达某个元素不存在。
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SimulatingNull {
	int id() default -1;
	String description() default "";
}

六、元注解(用来标注注解的注解)

元注解:用来标注注解的注解(也是JDK内置的注解)

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

常用的元注解:

  1. @Retention:设置注解的保持性
  2. @Target:设置注解可以出现的位置
  3. @Documented:设置注解是否可以生成到帮助文档中
  4. @Inherited:设置注解是否支持继承
  5. @Repeatable:设置注解在某一元素上是否可以重复使用(Java8新特性)

@Retention

@Retention:用于解释新声明注解的保留策略。使用Retention注解时必须用枚举类RetentionPolicy的三个常量对象之一来指定具体的保留策略。

  1. Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源代码(编译期)、字节码(类加载)或运行时(JVM中运行)
  2. 在@Retention注解中使用枚举RetectionPolicy来表示注解保留时期。
    1. @Retention(RetectionPolicy.SOURCE):注解仅存在于源码中,在字节码文件中不包含
    2. @Retention(RetectionPolicy.CLASS):注解在字节码文件中存在,但运行时无法获得
    3. @Retention(RetectionPolicy.RUNTIME):注解在字节码文件中存在,且运行时可以通过反射获取(程序员自定义的注解都使用这个策略,因为必须保证程序运行期间使用反射读取到注解信息)

@Target

用于解释新声明的注解可以使用在什么位置。使用Target注解时必须用枚举类的常量对象来指定具体的位置。如果某个注解声明时没有加Target注解,则表示所有位置都可以。

  1. 用于描述注解可以使用的位置,该注解使用ElementType枚举类型用于描述注解可以出现的位置

@Documented

用于解释新声明注解用在某个包、类、方法等上面后,当使用javadoc工具提取文档注释生成的API文档时,是否将对应的注解信息也读取到API文档。加@Documented的注解其@Retention的RetentionPolicy值必须为RUNTIME才有意义。

@Inherited

一个被@Inherited注解修饰的注解,如果该注解修饰了一个父类,则它的子类也会继承父类的注解

@Repeatable

Java 8以前的版本在使用注解时有一个限制,即相同的注解在同一位置只能使用一次,不能使用多次。Java 8引入了重复注解机制,这样相同的注解可以在同一地方使用多次,重复注解机制本身必须用@Repeatable注解标记。

Repeatable表示可以重复的含义,该注解属于JDK1.8版本的新特性,允许一个注解被使用一次或者多次。

七、反射注解

// 获取类
Class<MyClass> myClass = MyClass.class;

// 判断该类上是否存在这个注解
if (myClass.isAnnotationPresent(Annotation1.class)) {
	// 获取指定的某个注解
	Annotation1 a1 = myClass.getAnnotation(Annocation1.class);
	// 访问注解对象中的属性值
	System.out.println(a1.name());
}

标签:默认值,Java,复习,可以,使用,注解,属性,Retention
From: https://www.cnblogs.com/keyongkang/p/18199160

相关文章

  • java中的http请求的封装(GET、POST、form表单形式)
    前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现。HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,HttpClient3.1是org.apache.commons.httpclient下操作远程url的工具包,虽然已不再更新,但实现工作中使用httpC......
  • java基础 韩顺平老师的 异常 自己记的部分笔记
    443,异常处理入门 packagecom.hspedu.exception_;publicclassException{publicstaticvoidmain(String[]args){intnum1=10;intnum2=0;//老韩解读//1,num1/num2=10/0//2,当执行到num1/num2,因为num2......
  • 北航研究生算法期末复习整理
    课程名称:算法设计与分析参考往年题来源:TheBloodthirster/BUAA_Course_Sharing数据结构二叉树线索二叉树(ThreadedBinaryTree)利用二叉链表中空的指针域指出结点在某种遍历序列中的直接前驱或直接后继指向前驱和后继的指针称为线索实现不用栈的树深度优先遍历算法二叉查......
  • 说说JavaScript中的事件模型
    一、事件与事件流javascript中的事件,可以理解就是在HTML文档或者浏览器中发生的一种交互操作,使得网页具备互动性,常见的有加载事件、鼠标事件、自定义事件等由于DOM是一个树结构,如果在父子节点绑定事件时候,当触发子节点的时候,就存在一个顺序问题,这就涉及到了事件流的概念事件......
  • 北航研究生计算机网络实验期末复习
    基本命令看路由表#交换机MAC地址表[H3c]displaymac-address#查看arp缓存C:\arp-a#清空arp缓存(可能需要管理员权限打开cmd)C:\arp-d数据链路层PPP(PointtoPointProtocol)LCP(LinkControlProtocol):[R1-Serial1/0]link-protocolppp<R1>debuggin......
  • Java中的这些String特性可能需要了解下
    先总结下,String类具有以下特性:不可变性(Immutable):String对象一旦创建就不能被修改。任何对String对象的操作都会返回一个新的String对象,原始对象保持不变。字符串表(StringTable):StringTable表是一种存储字符串常量的内存区域,它可以提高字符串的重用率和性能。在创建字符串时,如果......
  • java代码的各个部分 在jvm里面分别对应什么区
    在 Java 中,代码和数据在 JVM(Java虚拟机)中的存储是分区管理的。这些区域各自承担不同的角色,以支持 Java 程序的运行。以下是 JVM 中主要的内存区域,以及它们与 Java 代码和数据的对应关系: 1. 方法区(Method Area) 存储内容:类信息、常量、静态变量、即时编译器编译后......
  • java取cookie的一些坑
    1.cookie有2个版本(version0与version1),version0最早是网景公司定的,比较保守,value值不能有特殊字符,比如冒号之类的,象GMT+05:30,在version0下,取出来,就变成GMT+05,冒号后的:30丢了 2.java中目前支持的是version0,以获取最好的兼容性 3.request.getCookies()并不能一......
  • java压缩网络图片,压缩图片
     方式一:使用Image.getScaledInstance使用jdk的awt包下的Image.getScaledInstance实现图片的缩放。好处是无需引入第三方jar,缺点是会稍微有点模糊。工具类ImageUtils:packageutils;importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.image.BufferedImage;......
  • JAVA KMP 纯模板
    纯模板记忆使用~classMain{staticchar[]s1;staticchar[]s2;staticint[]next;publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);s1=in.nextLine().toCharArray();s2=in.nextLine().to......