常识
注释:给程序员看的,帮助程序员理解程序的代码逻辑
注解:给程序看的,可以让程序根据有无注解而执行不同的代码逻辑
注解是从JDK1.5开始提出来的,可作为轻量化配置来使用,使用起来比xml配置文件更加轻便简单
自定义
定义注解和定义接口差不多使用@interface来定义,然后再使用元注解修饰
1. 下面是定义一个简单的注解first的例子
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface first {
String value();
}
@first
class test{
}
- 元注解:javaapi提供的用来定义注解的注解,一共四个分别是:@Target@Retention@Document@Inherited
元注解 | 功能 | 解释 |
---|---|---|
@Target | 控制自定义的注解可以修饰什么对象(没用此元注解修饰则默认所有对象都可以修饰) | 可以控制注解可以修饰类,属性还是方法构造方法等 |
@Retention | 控制自定义注解可以保留到什么阶段(源文件,编译,运行) | 注解没保留则不生效 |
@Document | 控制自定义注解能否被文档提取工具提取到文档中 | 能否被javadoc命令提取 |
@Inherited | 控制自定义注解是否具有继承性 | 当注解修饰父类时子类是否也被此注解修饰 |
@Target的参数 | 作用 |
---|---|
ElementType.ANNOTATION_TYPE | 开启修饰注解 |
ElementType.ANNOTATION_TYPE | 开启修饰构造方法 |
ElementType.TYPE | 开启修饰类 ,接口或enum |
ElementType.FIELD | 开启修饰属性 |
ElementType.METHOD | 开启修饰方法 |
ElementType.PARAMETER | 开启修饰参数 |
ElementType.LOCAL_VARIABLE | 开启修饰局部变量 |
ElementType.PACKAGE | 开启修饰包 |
注意:只要将上面的参数写入@Target参数位置就是开启修饰各种对象的权限
@Retention 参数 | 作用 |
---|---|
RetentionPolicy.SOURCE | 只在源文件中保留,java文件编译后就不保留 |
RetentionPolicy.CLASS | 编译后保留,运行阶段不保留 |
RetentionPolicy.RUNTIME | 运行阶段保留 |
- 注解类中添加属性
注解类中定义属性类似于接口定义方法;
注解中所有的属性必须是public的,也可以不修饰默认为public
注解中的属性只能是八种基本数据类型String和class类型,其他注释类型及以上类型的一维数组
注解中声明属性需要在使用注解是为其赋值,赋值方式: @注解名(属性名=属性值)
使用
可是用反射注射来使用(必须使注解保留到运行阶段)
有关注解的反射方法:
方法 | 作用 |
---|---|
isAnnotationPresent(Class<? extends Annotation> annotationClass) | 判断是否包含指定类型的注解 |
getAnnotation(Class annotationClass) | 获取该元素的指定类型的注解 |
getAnnotation() | 获取此元素上存在的所有注解 |
使用案例:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
enum Sort{
MATH,ENGLISH,CHINESE,ART
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface Course {
Sort value() default Sort.MATH;
}
@Course(Sort.CHINESE)
class Student{
}
public class Temp{
public static void main(String[] args) {
if(Student.class.isAnnotationPresent(Course.class)){
switch(Student.class.getAnnotation(Course.class).value()){
case MATH :
System.out.println("此学生选的是"+Sort.MATH);
break;
case ENGLISH :
System.out.println("此学生选的是"+Sort.ENGLISH);
break;
case CHINESE :
System.out.println("此学生选的是"+Sort.CHINESE);
break;
case ART :
System.out.println("此学生选的是"+Sort.ART);
break;
}
}else{
System.out.println("Student类上没有注解");
}
}
}
运行结果:此学生选的是CHINESE
附:
- 自定义注解中可以使用default来设置默认值
- 当注解类中的属性名为value且只有这个属性时,在是此注解时可直接在括号中写上要赋的值