什么是注解
注解与反射是所有框架的底层
注解不仅能给程序员看还能给计算机看
注解;Annotation
注释:Comment
Annotation是从JDK5.0开始引入的新技术.
Annotation的作用:
不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别)可以被其他程序(比如:编译器等)读取.
Annotation的格式:
注解是以"@注释名"在代码中存在的,还可以添加一些参数值﹐例如:@SuppressWarnings(value=“unchecked”).
Annotation在哪里使用?
可以附加在package , class , method , field等上面﹐相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问
内置注解
元注解
package annotation;
import java.lang.annotation.*;
/**
* Created by 此生辽阔 on 2021/7/6 9:40
*/
@MyAnnotation//自定义注解用在类上面
public class annoDemo {
@MyAnnotation//自定义注解用在方法上面
public void method1()
{
@MyAnnotation//自定义注解用在局部变量上面
int a=0;
}
@MyAnnotation//自定义注解用在成员变量上面
private static final int k=0;
@MyAnnotation//自定义注解用在成员变量上面
public String id;
@MyAnnotation//自定义注解用在构造器上面
public annoDemo(String id) {
this.id = id;
}
}
//Target表示我们的注解可以用在哪些地方
@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE})//可以用在方法上和成员变量,构造器上面,TYPE表示类,接口后者参数说明
//@Retention表示注解在什么地方还有效,有RUNTIME/CLASS/SOURCE三个选项
//其中,RUNTIME>CLASS>SOURCE,就是说如果你定义为RUNTIME,那么这个注解在CLASS和SOURCE也是有效的
//但是如果你定义为SOURCE,就只在SOURCE有效
@Retention(value= RetentionPolicy.RUNTIME)
@Documented//表示是否将我们的注解生成在javaDoc中
@Inherited//表示子类可以继承父类的注解
@interface MyAnnotation
{
}
下面报错就是因为@Target的value没加上ElementType.LOCAL_VARIABLE
测试javadoc的功能
下面都是自动生成的
我们点击annoDemo.html
另一个代码没有写@Documented,所以生成的html中没有注解信息
注解的Retention和RetentionPolicy的理解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
public enum RetentionPolicy {
//此注解类型的信息只会记录在源文件中,编译时将被编译器丢弃,也就是说
//不会保存在编译好的类信息中
SOURCE,
//编译器将注解记录在类文件中,但不会加载到JVM中。如果一个注解声明没指定范围,则系统
//默认值就是Class
CLASS,
//注解信息会保留在源文件、类文件中,在执行的时也加载到Java的JVM中,因此可以反射性的读取。
RUNTIME
}
注解按生命周期来划分可分为3类:
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
自定义注解
下面报错,我们要么在使用注解的时候传一个参数,要么在定义注解的时候就个name一个默认的值
①注解可以显示赋值,如果没有默认值,我们必须给注解赋值
②
package annotation.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by 此生辽阔 on 2021/7/6 10:40
*/
public class MyAnno2 {
@MyAnnotation2(age=1)
public void test(){
}
@MyAnnotation3("111")//当注解只有一个参数成员时,可以不用写参数名字,直接复制
public void test2(){
}
}
@Target(value={ElementType.TYPE,ElementType.METHOD})
@Retention(value= RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
String name() default "";
int age();
int od() default -1;//如果默认值为-1,代表不存在
String[] schols() default {"清华大学"};
}
@interface MyAnnotation3{
String value();
}
弹幕区
自定义注解其实挺有用的,你以后可以将事务啊,或者依稀儿童用的工具写成注解,之后哪里需要,你直接加个注解就完了
注解就是在你编程中有些代码可以通过注解来解释代码的含义,方便读懂代码
项目中注解可以用来验证登录,身份认证
推荐阅读
Java注解的Retention和RetentionPolicy
自定义注解之运行时注解(RetentionPolicy.RUNTIME)
这是一位大佬根据黑马的注解课程做的笔记【Java基础】 注解