1.概念
- 概念
- 注解:说明程序的,给计算机看的
- 注释:用文字解释程序的,给程序员看的
- 作用分类
1.编写文档:通过标识的注解生成文档
在想要生成方法注解的方法上方,输入/** 后回车,就会自动生成注释
/**
* @author Mango
* @version 1.1
* @since JDK100
*/
public class Demo01 {
public static void main(String[] args) {
}
/**
*
* @param a 加数
* @param b 被加数
* @return 求和
*/
public int add(int a,int b){
return a+b;
}
}
文件夹中shift+右键,
2.代码分析:通过注解对代码进行分析【使用反射】
3.编译检查:如函数式接口注解@FunctionalInterface
,覆盖重写注解@Override
等
2.JDK预定义的一些注解
-
@Override
:检查覆盖重写 -
@Deprecated
:表示被注解的元素已过时
-
@SuppressWarnings
:压制警告。类开头使用@SupperWarnings("all")
可以让警告不再显示
3.自定义注解
3.1格式:
元注解;//部分1
public @interface 注解名称{//部分2
属性列表;
}
3.2 部分2
- 本质:接口
- 属性(接口中可以定义的抽象方法)
- 属性要求:
- 方法的返回值类型不可以有
void
和类
- 定义了属性(抽象方法),在使用注解时必须要进行赋值;默认值在注解中用
default
赋值;如果只有一个属性,属性名为value()
,则可以直接定义值
public @interface MyAnno {
public abstract int age();//注解中定义了属性(抽象接口)
String name();//简写注解中定义了属性(抽象接口)
int weight() default 123;//默认值在注解中用`default`赋值
}
public @interface MyAnno2 {
int value();
}
public class Demo03 {
@MyAnno(age = 1,name = "张三")//使用注解时必须要对其属性进行赋值
public void method01(){
}
@MyAnno2(12)//如果只有一个属性,属性名为value(),则可以直接定义值
public void method02(){
}
}
3.3 部分1元注解
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
-
@Target
:描述注解能够作用的位置
类型 | 注解能够作用的位置 |
---|---|
ElementType.TYPE | 可以作用于类上 |
ElementType.METHOD | 可以作用与方法上 |
ElementType.FIELD | 可以作用与成员变量上 |
例一:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)//ElementType.TYPE可以作用于类上
public @interface Anno01 {
int method();
}
例二:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
/* ElementType.TYPE 可以作用于类上
ElementType.METHOD 可以作用与方法上
ElementType.FIELD 可以作用与成员变量上*/
public @interface Anno01 {
int method();
}
-
@Retention
:描述注解能够保留的阶段(源码,Class,Runtime)
类型 | 注解能够保留的阶段 |
---|---|
RetentionPolicy.SOURCE | 注解只在源码阶段保留 |
RetentionPolicy.CLASS | 注解只被保留到编译进行的时候 |
RetentionPolicy.RUNTIME | 注解可以保留到程序运行的时候 (常用) |
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//注解可以保留到程序运行的时候
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
public @interface Anno01 {
int method();
}
-
@Documented
:描述注解是否能够被抽取到javadoc文档中
import java.lang.annotation.*;
@Documented//注解是会被抽取到javadoc文档中
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
public @interface Anno01 {
int method();
}
-
@Inherited
:描述注解是否能够被子类继承
4.程序中解析注解(获取程序中定义的属性值)
- 获取注解定义的位置的对象(类、方法、成员变量)
- 根据获取到的对象,获取指定的注解
- 调用注解中的抽象方法,获取配置的属性值
例一:作用于类上
注解:
import java.lang.annotation.*;
@Documented//
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Anno01 {
int age();
String name();
}
主程序:
@Anno01(name = "张三",age = 14)
public class Demo05 {
public static void main(String[] args) {
//获取注解定义的位置的对象(类、方法、成员变量)
Class<Demo05> c1= Demo05.class;
//根据获取到的对象,获取指定的注解
Anno01 anoo01 = c1.getAnnotation(Anno01.class);
//调用注解中的抽象方法,获取配置的属性值
String name = anoo01.name();
int age = anoo01.age();
}
}
例一:作用于方法上
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Anno02 {
int age();
}
public class Demo04 {
@Anno02(age = 1)
public static void method() {
Class<Demo04> c = Demo04.class;
Anno02 a =c.getAnnotation(Anno02.class);
a.age();
}
}