注解基本使用

注解

1. 注解概述

1.1 注解解释
注释:
	解释代码,给程序员看

注解:
	Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注
	JDK1.5之后的特征
	用于说明程序
	一般在框架中使用
	格式:
		@AnnotationName

文档注释:
	@param @return @Exeception 从根本上是一个注释,不存在代码编译,不会生成对应的.class字节码问题,只是提供给JavaDoc API文件生成工具。作为标记生成对应的文档。
	
注解是有一部分参与编译
	@Override并不是没编译就有效果了,是因为不管是Eclipse还是IDEA都可以预编译Java代码生成对应的.class文件的
1.2 注解作用
生成文档:
	代码中生成对应的JavaDoc API文档
	@param @return 
	
	【IDEA JavaDoc工具使用参数】
		Other  Command Line Arguments : -encoding utf-8 -charset utf-8
		解决中文乱码,因为IDEA默认编码集为UTF-8 Windows GKB

代码检查:
	继承重写,或者说接口遵从之后的实现中,存在@Override
	
代码数据获取: [小框架]
	通过反射获取指定注解中的一些内容,例如 配置,数据,操作,验证。。。
1.3 Java中预定义的一些注解
@Override:
	重写/实现方法的情况下,检查方法声明是否和父类或者接口中的方法声明一致。强制格式检查。
	
@Deprecated
	标注当前方法已过时,例如 Data日期类内的一些方法
	
@SuppressWarnings("all")
	压制警告,可以用于一些代码中存在明确无异常的情况下,压制一些警告

2. Java中自定义注解

2.1 Java中自定义注解的方式
格式:
	public @interface AnnotationName {
		属性列表;
	}
	
Annotation注解是可以编译得到对应的.class字节码文件,验证了注解是可以参与编译过程的

通过反编译工具可以得到一下内容
【Annotation本质】
public interface MyAnnotation1 extends java.lang.annotation.Annotation {
}

MyAnnotation1
	本质是一个interface,同时java.lang.annotation.Annotation 子接口
package com.qfedu.a_annotation.MyAnnotation;

/**
 * 自定义注解!!!
 * public interface MyAnnotation1 extends java.lang.annotation.Annotation {
 * }
 *
 * @author Anonymous
 * @date 2020/3/10 11:01
 */
public @interface MyAnnotation1 {
    // 属性 ==> 方法形式
}

2.2 Annotation注解属性【难点】
属性:
	开发书写代码使用注解的方式中,数据使用方式更加偏向于属性概念。
		使用 
			1. 在书写代码中使用
				@MyAnnotation(id=1, name="骚磊", age=16)
			2. 利用反射时,会涉及到getXXX方法
				通过属性名获取对应值的概念来完成的
				
	【但是实际上是利用abstract方法来完成属性概念的】

属性使用的格式[实际按照方法格式操作]
	1. 属性的值数据类型和对应具体数据 ==> 返回值类型和返回的数据
		属性类型支持:
			a. 基本数据类型
			b. String类型
			c. 其他的注解类型
			d. 枚举类型 
				枚举就是一个带有名字的常量,为了更好的域阅读性和操作
			e. 以上类型对相应的数组
		
		属性值要求
			a. 定义属性时可以使用default关键字,加上默认值,该属性在使用的过程中是
			没有强制要求属性值,如果没有赋予属性值,采用对应的默认值操作,如果赋
			值,使用对应值
			
			b. 如果注解中有且只有一个value属性,或者说注解中除value属性之外,都有
			默认值,不管是类,方法,成员变量,包使用当前注解是可以直接在括号内加入
			对应数据类型数值、
			
			c. 如果属性是数组类型, {}大括号保存,并且不同的内容,使用,隔开
	2. 属性的键名字 ==> 方法的名字
2.3 元注解
给予注解的解释,用于约束注解的一些操作问题
@Retention - 
	标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
	RetentionPolicy.RUNTIME:当前注解会编译生成对应的.class字节码文件,并且可以加
	载到JVM中,参与代码执行
	RetentionPolicy.CLASS: 
	
别纠结,记下就好:
	RetentionPolicy.SOURCE:注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里)
	@Override
	对应属性RetentionPolicy.SOURCE
	在代码编译过程中,检查方法格式是否正确,不参与代码运行和解析。
	
@Documented 
	标记这些注解是否包含在用户文档中。
	是否可以通过JavaDoc工具,生成对应的API文档
	
@Target 
	标记这个注解应该是哪种 Java 成员。
	属性:
		ElementType
			TYPE: 当前注解可以用于类声明
			METHOD: 当前注解可以用于方法声明位置
			FIELD:当前注解可以用于成员变量声明位置
@Inherited 
	标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
	
【重点】
	@Target目标
		可以作用范围 类,方法,成员变量...
	@Retention
		RetentionPolicy.RUNTIME 常用
发布了18 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/LioTomcat/article/details/104781672