• JDK 5.0 注解知识快速进阶


    1、了解注解

      对于Java开发人员来说,在编写代码时,除了源程序外,还会使用Javadoc标签对类、方法或成员变量进行注释,一遍使用Javadoc工具生成和源代码配套的Javadoc文件,如@param、@return就是注解标签。我们可以使用Xdoclet快速生成对应程序代码的配置文件。在JDK5.0中,自定义这些标签,并通过Java语言的反射机制获取类中标注的注解,完成特定的功能。
      注解是代码的附属信息,它遵循一个基本原则:注解不能直接干扰程序代码的运行,无论是增加还是删除注解,代码都能正常运行。Java语言解释器会忽略这些注解,而由第三方工具负责对注解进行处理。第三方工具可以利用代码中的注解间接控制程序代码的运行,它们通过Java反射机制读取注解的信息,并根据这些信息更改目标程序的逻辑,而这正是Spring AOP对@AspectJ提供支持所采取的方法。
     
    2、一个简单的注解类
    注解类NeedTest:
    package com.yyq.annotation;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    @Retention(RetentionPolicy.RUNTIME)//1-声明注解的保留期限
    @Target(ElementType.METHOD) //2-声明可以使用该注解的目标类型
    public @interface NeedTest {    //3-定义注解
        boolean value() default true;   //4-声明注解成员
    }
        Java新语法规定使用@interface修饰符定义注解类。一个注解可以拥有多个成员、成员声明和接口方法声明。成员声明的限制:
            1)成员以无入参无抛出异常的方式声明。
            2)可以通过default为成员指定一个默认值,也可以不指定。
            3)成员类型是受限的,合法的类型包括原始类型及其封装类,而自定义的类型如ForumService value()是非法的。
        1-和2-为Java预定义的注解,称为元注解(Meta-Annotation),它们被Java编译器使用,会对注解类的行为产生影响。@Retention(RetentionPolicy.RUNTIME)表示NeetTest这个注解可以在运行期被JVM读取,注解的保留期限类型在java.lang.annotation.Retention类中定义,介绍如下:
            1)SOURCE:注解信息仅保留在目标类代码的源码文件中,但对应的字节码文件将不再保留;
            2)CLASS:注解信息将进入目标类代码的字节码文件中,但类加载器加载字节码文件时不会将注解加载到JVM中,也即运行期不能获取注解信息;
            3)RUNTIME:注解信息在目标类加载到JVM后依然保留,在运行期可以通过反射机制读取类中注解信息。
        Target(ElementType.METHOD)表示NeedTest这个注解只能应用到目标类的方法上,注解的应用目标在java.lang.annotation.ElementType类中定义:
            1)TYPE:类、接口、注解类、Enum声明处,相应的注解称为类型注解;
            2)FIELD:类成员变量或常量声明处,相应的注解称为域值注解;
            3)METHOD:方法声明处,相应的注解称为方法注解;
            4)PARAMETER:参数声明处,相应的注解称为参数注解;
            5)CONSTRUCTOR:构造函数声明处,相应的注解称为构造函数注解;
            6)LOCAL_VARIABLE:局部变量声明处,相应的注解称为局域变量注解;
            7)ANNOTATION_TYPE:注解类声明处,相应的注解称为注解类注解,ElementType.TYPE包括ElementType.ANNOTATION_TYPE;
            8)PACKAGE:包声明处,相应的注解称为包注解。
        如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=),如NeedTest(true)。注解类拥有多个成员时,如果仅对value成员进行赋值则也可以不使用赋值号,如果同时对多个成员进行赋值,则必须使用赋值号,如DeclareParents(value = "NaiveWaiter", defaultImpl = "SmartSeller.class")。
     
    3、使用注解
    ForumService:使用注解类
    package com.yyq.annotation;
    public class ForumService {
        @NeedTest(value = true)
        public void deleteForum(int forumId) {
            System.out.println("删除论坛模块:" + forumId);
        }
        @NeedTest(value = false)
        public void deleteTopic(int postId) {
            System.out.println("删除论坛主题:" + postId);
        }
    }

      对注解成员进行赋值的格式:

        @<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,...)
     
    4、访问注解
        通过反射机制访问类中的注解。访问注解信息的方法:<T extends Annotation>T getAnnotation(Class<T> annotationClass)。
    TestTool测试方法:访问代码中的注解
    @Test
        public void ToolTest() {
            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() + "()需要测试");
                    } else {
                        System.out.println(method.getName() + "()不需要测试");
                    }
                }
            }
        }
    输出结果:
    2
    deleteTopic()不需要测试
    deleteForum()需要测试
     
  • 相关阅读:
    转:Intellij idea创建javaWeb以及Servlet简单实现
    IntelliJ IDEA控制台启动Tomcat输出中文乱码问题
    Tomcat 输出日志出现中文乱码
    转:Java Web 项目发布到Tomcat中三种部署方法
    运行tomcat7w.exe提示指定的服务未安装 解决办法
    (转)ASP.NET MVC:Razor 引入命名空间
    (转)解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题
    svn移动目录时如何保留原来的日志
    Memcached 教程
    最近帮朋友写了一个百度竞价关键词快速分词(分组)工具,支持与或逻辑分组,附源码和工具下载链接
  • 原文地址:https://www.cnblogs.com/yangyquin/p/5488411.html
Copyright © 2020-2023  润新知