zoukankan      html  css  js  c++  java
  • java注解

    一、java 自身的注解

    • @Deprecated 表明当前的元素已经不推荐使用
    • @Override 表明当前方法是覆盖了父类方法
    • @SuppressWarnings 关闭编译器警告信息

    二、自定义注解

    接口声明

    1 @Target(ElementType.METHOD)
    2 @Retention(RetentionPolicy.RUNTIME)
    3 public @interface MyMethodAnnotation {
    4 
    5 }

    使用自定义注解

     1 public class AnnotationDemo {
     2 
     3     @MyMethodAnnotation
     4     public void test() {
     5         
     6     }
     7     
     8     @MyMethodAnnotation
     9     public void test2() {
    10         
    11     }
    12     
    13     public void test3() {
    14         
    15     }
    16 }

    测试

     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         Method[] methods = AnnotationDemo.class.getMethods();
     5         for(Method m : methods) {
     6             if(m.isAnnotationPresent(MyMethodAnnotation.class)) {
     7                 System.out.println("----- " + m.getName() + " -------");
     8             }
     9         }
    10     }
    11 }

    结果

    ----- test -------
    ----- test2 -------

    三、元注解

    作用负责注解其它注解

    @Target
    @Retention
    @Documented
    @Inherited

     1、@Target : 描述注解的使用范围

      取值(ElementType)有,

    public enum ElementType {
        /** Class, interface (including annotation type), or enum declaration */
        TYPE, // 用于描述类、接口(包括注解类型) 或enum声明
    
        /** Field declaration (includes enum constants) */
        FIELD, // 用于描述域
    
        /** Method declaration */
        METHOD, // 用于描述方法
    
        /** Parameter declaration */
        PARAMETER, // 用于描述参数
    
        /** Constructor declaration */
        CONSTRUCTOR, // 用于描述构造函数
    
        /** Local variable declaration */
        LOCAL_VARIABLE, // 用于描述局部变量
    
        /** Annotation type declaration */
        ANNOTATION_TYPE,
    
        /** Package declaration */
        PACKAGE // 用于描述包
    }

     2、@Retention : 描述注解的生命周期

    public enum RetentionPolicy {
        /**
         * Annotations are to be discarded by the compiler.
         */
        SOURCE,  //在源文件有效 保留在源文件
    
        /**
         * Annotations are to be recorded in the class file by the compiler
         * but need not be retained by the VM at run time.  This is the default
         * behavior.
         */
        CLASS, //在class文件有效 保留在class文件
    
        /**
         * Annotations are to be recorded in the class file by the compiler and
         * retained by the VM at run time, so they may be read reflectively.
         *
         * @see java.lang.reflect.AnnotatedElement
         */
        RUNTIME //在运行时有效 运行时保留
    }

    3、@Documented : 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化

    4、@Inherited :阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

    四、启示

    想想,自定义注解还是有很多好处的。junit测试框架,方法上注解@Test,@Before, @After。没看过它的底层实现,不过仔细想想,无非也是通过运行期反射去拿到定义在方法的注解,

    根据不同注解类型,来执行不同的操作。

  • 相关阅读:
    Windows下路由表分析
    VMware Workstation网络连接的三种模式
    VMware Workstation环境下的三种网络配置桥接,NAT和HOST-ONLY
    Binary Tree Right Side View
    Count Complete Tree Nodes
    Flatten Binary Tree to Linked List
    Valid Anagram
    SELINUX部分的权限规则问题鸟哥7.4&&7.5?????
    网络五层架构及各层使用的协议
    Linux的echo -n -e 两个参数的含义
  • 原文地址:https://www.cnblogs.com/chenmo-xpw/p/5533239.html
Copyright © 2011-2022 走看看