Java基础:注解

注解的理解和类型

java注解-最通俗易懂的讲解
廖雪峰java注解
对注解(Annotation)最直接的理解是,注解本身就相当于一个附加信息,这个附加信息并不会对原有的类,方法等进行处理,进行处理的应该是对附加信息进行处理的方法,这些方法根据附加信息进行进一步处理

注解可分为三类:

  1. 由编译器使用的注解:(编译时使用,编译后扔掉)
    • @Override:让编译器检查该方法是否正确地实现了覆写;
    • @SuppressWarnings:告诉编译器忽略此处代码产生的警告。
  2. 工具处理.class文件使用的注解,这些工具加载class对class做动态修改,实现特殊功能,但加载结束不会存在于内存。一般不用我们自己处理
  3. 程序运行期间能够读取的注解,加载后一直存在于JVM中。这一类注解是由自己编写的java代码进行处理,而不是JVM自动识别处理

元注解

  • Retention: 表示注解的存活时间
    • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
    • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
    • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
  • Documented:够将注解中的元素包含到 Javadoc 中去。
  • Target: 定义注解应用在源码的位置
    • 类或接口:ElementType.TYPE;
    • 字段:ElementType.FIELD;
    • 方法:ElementType.METHOD;
    • 构造方法:ElementType.CONSTRUCTOR;
    • 方法参数:ElementType.PARAMETER。
  • Inherited:如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

注解的定义

使用@interface定义注解

@Target(ElementType.TYPE)
@Rentation(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
	int id() default -1;
	String msg() default "hi";
}

注解只有成员变量,没有方法,成员变量的定义是无形参方法来声明。使用default指定默认值(推荐)

赋值方法&使用方法

@TestAnnotation(id=3, msg="hello annotation")
public class Test {
}

//使用默认值
@TestAnnotation()
public class Test {
}

其他:

  • 还有一种情况。如果一个注解内仅仅只有一个名字为 value 的属性时,应用这个注解时可以直接接属性值填写到括号内
  • 一个注解没有任何属性,那么在应用这个注解的时候,括号都可以省略。

注解的处理

//判断是否应用某个注解(注解为annotationClass)
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
//获取 Annotation 对象:返回指定类型注解
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
//获取Annotation对象:返回注解到这个元素上的所有注解
public Annotation[] getAnnotations() {}

处理案例代码

@TestAnnotation()
public class Test {
    public static void main(String[] args) {
        boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
        if ( hasAnnotation ) {
            TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
            System.out.println("id:"+testAnnotation.id());
            System.out.println("msg:"+testAnnotation.msg());
        }
    }
}

你可能感兴趣的:(Java,java,开发语言)