Java注解学习

Java Annotation 是在JDK1.5之后增添的新特性.

他是用来标识类,构造方法,方法,字段上的一个标记.

根据该标记,来进行特定的处理.

JDK中自带的有三个注解.

  @Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。

  @Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上。

  @SuppressWarnings:表示关闭一些不当的编译器警告信息。

其他的一些都是自定义注解,所有的注解都是隐身的继承于 java.lang.annotation.Annotation.

自定义注解:

  自定义注解都是以@interface标注.

  在其定义上面有四个注解标注:

  @Target
  @Retention

  @Documented
  @Inherited  代码中介绍各个属性的意义

定义:

 1 package com.yemaozi.annotation.demo01;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.ElementType;
 5 import java.lang.annotation.Retention;
 6 import java.lang.annotation.RetentionPolicy;
 7 import java.lang.annotation.Target;
 8 /**
 9  *      //@interface
10  *             自定义注解的关节字,java中所有的注解默认.
11  *   //@Retention
12  *           RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉
13  *           RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
14  *           RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
15  *   //@Target
16  *            ElemenetType.CONSTRUCTOR 构造器声明。       
17  *            ElemenetType.FIELD 域声明(包括 enum 实例)。   
18  *            ElemenetType.LOCAL_VARIABLE 局部变量声明。   
19  *            ElemenetType.METHOD 方法声明。             
20  *            ElemenetType.PACKAGE 包声明。             
21  *            ElemenetType.PARAMETER 参数声明。          
22  *            ElemenetType.TYPE 类,接口(包括注解类型)或enum声明。                                      
23  *            ElemenetType.CONSTRUCTOR 构造器声明。       
24  *            ElemenetType.FIELD 域声明(包括 enum 实例)。   
25  *            ElemenetType.LOCAL_VARIABLE 局部变量声明。   
26  *            ElemenetType.METHOD 方法声明。             
27  *            ElemenetType.PACKAGE 包声明。             
28  *            ElemenetType.PARAMETER 参数声明。          
29  *            ElemenetType.TYPE 类,接口(包括注解类型)或enum声明。
30  *   //@Documented
31  *           目的就是将这一Annotation的信息显示在JAVA API文档上,如果没有增加@Documented的话,JAVA API文档上不会显示相关annotation信息
32  *   //@Inherited
33  *           允许子类继承父类中的注解
34  * @author yemaozi
35  *
36  */
37 @Retention(RetentionPolicy.RUNTIME)
38 @Target({ElementType.METHOD, ElementType.TYPE})
39 @Documented
40 public @interface MyAnnotation {
41     //定义注解属性
42     String value() default "默认值!";
43     //其他类型都可在此定义....
44     //...
45 }

使用该注解

import java.lang.reflect.Method;

/**
 * 使用该注解
 * @author yemaozi
 *
 */
@MyAnnotation(value="在类上使用!")
public class MyAnnotationTest {
    
    @MyAnnotation(value="在方法上使用!")
    public void test(){
        
    }
    
    public static void main(String[] args) throws Exception {
        //判断MyAnnotationTest类上是否有@MyAnnotation注解
        if(MyAnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){
            //获取@MyAnnotaion注解
            MyAnnotation anno = MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
            //获取类注解上的属性值
            String value = anno.value();
            System.out.println("类上的注解属性值:"+value);
        }
        //获取test方法上的注解
        //获取test方法
        Method method = MyAnnotationTest.class.getMethod("test");
        if(method.isAnnotationPresent(MyAnnotation.class)){
            MyAnnotation anno = method.getAnnotation(MyAnnotation.class);
            //获取方法注解上的属性值
            String value = anno.value();
            System.out.println("方法注解上的属性值:" + value);
        }
    }
    
    
}

 输出结果为:

类上的注解属性值:在类上使用!
方法注解上的属性值:在方法上使用!
原文地址:https://www.cnblogs.com/yemaozistar/p/4157694.html