Java 注解

1.      简介

注解是Java 1.5 引入的新特性,它为我们在代码中添加信息提供了一种形式化的方法,我们可以在后续的某个时刻方便的使用这些数据。

注解的语法非常简单,除了使用@符号之外,基本与Java固有的语法保持一致,在Java1.5中内置了三种注解,定义在java.lang中:

@Override:表示当前的方法将覆盖超类中的方法

@Deprecated:表示被其注释的元素已经被抛弃,不应该使用

@SuppressWarnings:关闭某些编译器警告

2.      元注解

在定义注解时,会需要另一个注解类,这个“另一个注解类”就叫做元注解,目前Java内置了三种元注解,专门负责注解其他注解:

@Target:表示该注解可以用于什么地方,参数取值为:

       CONSTRUCTOR:构造器声明

       FIELD:域声明(包括enum实例)

       LOCAL_VARIABLE:局部变量声明

       METHOD:方法声明

PACKAGE:包声明

PARAMETER:参数声明

TYPE:类、接口(包括注解类型)或enum声明

       @Retention:表示需要在什么级别保存该注解信息,可选的参数为:

              SOURCE:注解将被编译器丢弃

              CLASS:注解在class文件中可用,但会被VM丢弃

              RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息

       @Documented:将此注解包含在JavaDoc中

       @Inherited:允许子类继承父类中的注解

3.      自定义注解

自定义注解一般的使用包含以下三个方面:定义注解类、应用注解类去注解、反射操作。

定义注解类与定义一般的接口类似,只需要加上@标志即可,如下代码:

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, ElementType.TYPE}) //可以用于类、方法

public @interface MyAnnotation {

    String color();

    String value() default "VALUE";

    int[] array() default {1, 2, 3};   

}

 

注解定义后,必须通过反射解析才能发挥注解的作用,将自定义注解应用于类名AnnotationUse和方法use()上,然后通过反射操作分别解析出了两处注解。第一处注解作用于类上,所以必须通过类class来获取该注解,第二处注解应用于方法上,所以需要通过方法来获取。代码如下:

import java.lang.reflect.Method;

import java.util.Arrays;

 

@MyAnnotation(color = "blue")

public class AnnotationUse {

   

    @MyAnnotation(color = "red")

    public void use() {

    }

    public static void main(String []args) {

       

        MyAnnotation annotation = (MyAnnotation)AnnotationUse.class.getAnnotation(MyAnnotation.class);

        System.out.println(annotation.value());

        System.out.println(annotation.color());

        System.out.println(Arrays.toString(annotation.array()));

       

        Method []method = AnnotationUse.class.getDeclaredMethods();

        for(Method m : method) {

            if(null != (annotation = (MyAnnotation)m.getAnnotation(MyAnnotation.class))) {

                System.out.println(annotation.color());

            }

        }

    }

}

 

posted @ 2019-06-17 16:16  LemonPi  阅读(163)  评论(0编辑  收藏  举报