Annotation原理

为什么使用注解:

  1、通过注解,可保存源数据在Java源代码中;并且注解不同于注释,注解享有编译期的类型检查保护。

  2、可在描述符性质的类或接口中抽取重复性的工作,通过注解来简化与自动化这些工作。

注解本身:

  1、三个点:

   1) 注解的@Target和@Retention

   2) 注解的属性

   3) 注解处理器

四个元注解:

@Target 表示注解可以用于什么地方。(ElementType.FIELD 字段,包括enum实例

/LOCAL_VARIABLE

/CONSTRUCTOR

/METHOD

/TYPE

/PACKAGE

/PARAMETER

@Retention 表示需要在什么级别保存该注解信息。(RetentionPolicy.RUNTIME VM在运行期也保留注解

/SOURCE 注解将被编译器丢弃

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

@Documented 将此注解包含在Javadoc中

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

注解处理器:

  如果没有用来读取注解的工具,那注解也不会比注释更有用。   ——《Thinking in java》

  原理:

    通过反射得到某一个类上的注解、或者是某一个方法、某一个字段上的注解,然后取到注解的属性值,去完成相应需要的业务工作。

自定义一个简单注解,通过反射来处理。

//定义一个注解

@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)
public @interface Display { String value() default "no values"; }
public class Hello {
   //将自定义注解贴在一个方法上
    @Display("hello")
    public void sayHello(){

    }
}
// 注解处理器
public
class DisplayTracker {    //通过反射得到该方法上的Display注解。 public static void trackDisplays(Class<?> cl){ for(Method m :cl.getDeclaredMethods()){ Display display = m.getAnnotation(Display.class); if(display!=null){ System.out.println(display.value()); } } }
public static void main(String[] args) { trackDisplays(Hello.class); }
}

   输出:

  

原文地址:https://www.cnblogs.com/oliverBolg/p/10070619.html