zoukankan      html  css  js  c++  java
  • 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); }
    }

       输出:

      

  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/oliverBolg/p/10070619.html
Copyright © 2011-2022 走看看