zoukankan      html  css  js  c++  java
  • java基础系列——注解

    注解是代码的附属信息,它遵循一个原则:注解不能直接干涉程序代码的运行,无论增加或者删除注解,代码都能够正常运行。java语言解释器会忽略掉这些注解,而由第三方工具负责对注解进行处理。第三方工具可以利用代码中的注解间接的控制程序代码的运行,他们通过java的反射机制读取注解的信息,并根据这些信息更改目标程序的逻辑。

    注解定义类:

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * Author: Leo Sun
     * Blog: http://fuxinci.com/
     * Date: 3/27/13
     */
    
    @Retention(RetentionPolicy.RUNTIME)     // 声明注解的保留期限
    @Target(ElementType.METHOD)             // 声明可以使用该注解的目标类型
    public @interface NeedTest {            // 定义注解
        boolean value() default true;       // 声明注解成员,1.成员无入参无抛出异常的方式声明,2.可以通过default为成员指定一个默认值,3.成员类型受限,合法类型包括原始类型和包装类
                           // 如果只有一个属性,那么必须是value
    }
    Retention,在java.lang.annotation.RetentionPolicy中定义
      SOURCE:注册信息仅保留在目标代码的源文件中,对相应的字节码文件将不保留。
      CLASS:注解信息将进入目标类代码的字节码文件中,但是类加载其加载字节码文件时不会将注解加载到JVM中,即运行期无法获得注解信息。
      RUNTIME:注解信息在目标类加载到JVM后依然保留,在运行期可以通过反射机制读取类中注解的内容。

    Target,在java.lang.annotation.ElementType中进行定义
      TYPE:类,接口,注解类,Enum声明处
      FIELD:类成员变量或常量声明处
      METHOD:方法声明处
      PARAMETER:参数声明处
      CONSTRUCTOR:构造函数声明处
      LOCAL_VARIABLE:局部变量声明处
      ANNOTATION_TYPE:注解类声明处
      PACKAGE:包声明处

    使用注解

    /**
     * Author: Leo Sun
     * Blog: http://fuxinci.com/
     * Date: 3/27/13
     */
    public class ForumService {
        @NeedTest(true)
        public void deleteForum(int forumId) {
            System.out.println("Delete forum :" + forumId);
        }
    
        @NeedTest(false)
        public void deleteTopic(int topicId) {
            System.out.println("Delete topic :" + topicId);
        }
    }

    测试代码

    import java.lang.reflect.Method;
    
    /**
     * Author: Leo Sun
     * Blog: http://fuxinci.com/
     * Date: 3/27/13
     */
    public class TestTool {
        public static void main(String[] args) {
            Class clazz = ForumService.class;
            Method[] methods = clazz.getDeclaredMethods();
            System.out.println(methods.length);
    
            for (Method method : methods) {
                NeedTest nt = method.getAnnotation(NeedTest.class);
                if (nt != null) {
                    if (nt.value()) {
                        System.out.println(method.getName() + " Need Test...");
                    } else {
                        System.out.println(method.getName() + " Need Not Test...");
                    }
                }
            }
        }
    }
  • 相关阅读:
    第24天:Python 标准库概览2
    第23天:Python 标准库概览1
    第22天:Python NameSpace&Scope
    第21天: Web 开发 Jinja2 模板引擎
    第20天:Python 之装饰器
    第19天:Python 之迭代器
    第18天:Python 高阶函数
    第17天:Python 函数之参数
    第16天:Python 错误和异常
    第15天:Python set
  • 原文地址:https://www.cnblogs.com/fuxinci/p/2984410.html
Copyright © 2011-2022 走看看