java基础--注解

package annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
/**
 *
   元注解: 元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
   @Retention、@Documented、@Target、@Inherited、@Repeatable 
   
   1.@Retention
     RetentionPolicy.RUNTIME 注解会在class字节码文件中存在,在运行时可以通过反射获取到
     RetentionPolicy.CLASS 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
     RetentionPolicy.SOURCE 注解仅存在于源码中,在class字节码文件中不包含
   2.@Documented
               顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。
   3.@Target 
              是目标的意思,@Target 指定了注解运用的地方。
              @Target({ElementType.METHOD,ElementType.TYPE})
    ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
    ElementType.CONSTRUCTOR 可以给构造方法进行注解
    ElementType.FIELD 可以给属性进行注解
    ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
    ElementType.METHOD 可以给方法进行注解
    ElementType.PACKAGE 可以给一个包进行注解
    ElementType.PARAMETER 可以给一个方法内的参数进行注解
    ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
   4.@Inherited 
           是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
           说的比较抽象 
    @Inherited
    @Retention(RetentionPolicy.RUNTIME)
    @interface Test {}
    @Test
    public class A {}
    public class B extends A {}
    注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。 
   5.@Repeatable
    Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。 
    @Person(role="artist")
    @Person(role="coder")
    @Person(role="PM")
    public class SuperMan{}    
    
    没有属性时  括号可省略
    @Auth
 * 
 *
 */
public @interface Auth {
    
    /**
     * 注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明
     * 在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。 
     * @return
     */
    String value() default "";
    
    String [] name();
    
    String group() default "group1";
    
    

}


/**
 * 
 * 注解的获取
 * 
 * 1类注解
 * TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
 * 2成员变量注解获取
 * Field a = Test.class.getDeclaredField("a");
   a.setAccessible(true);
   //获取一个成员变量上的注解
   Check check = a.getAnnotation(Check.class);
   
   3.方法上的注解获取
   Method testMethod = Test.class.getDeclaredMethod("testMethod");
   Annotation[] ans = testMethod.getAnnotations();
    for( int i = 0;i < ans.length;i++) {
        System.out.println("method testMethod annotation:"+ans[i].annotationType().getSimpleName());
    }
   
 * 
 * 
 * 
 */
原文地址:https://www.cnblogs.com/jentary/p/11103522.html