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()需要测试
 

JDK 5.0 注解知识快速进阶的更多相关文章

  1. JDK 5.0 注解的使用

    了解注解 在编写代码时,除了源程序以外,我们还会使用Javadoc标签对类.方法或成员变量进行注解,以便使用Javadoc工具生成和源代码配套的Javadoc文档. /** * 重写toString ...

  2. 批处理基本知识以及进阶 V2.0

    批处理基本知识以及进阶 将以要执行的程序指令 , 像在 dos 模式下一下写入记事本 , 保存成 bat 文件 , 就可以执行了 一 . 简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求 ...

  3. spring3.0注解

    一.前言 在日常的开发过程中,我们基本上都是采用注解的方式进行开发,提升开发的效率.不管是struts2.spring.hibernate.或者ibatis,这样方便开发,减少配置文件的数量:有益于团 ...

  4. Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制

    新的锁定类提高了同步性 —— 但还不能现在就抛弃 synchronized JDK 5.0为开发人员开发高性能的并发应用程序提供了一些很有效的新选择.例如,java.util.concurrent.l ...

  5. VC6.0调试知识大全

    VC6.0调试知识大全 分类: C++ 2010-09-06 21:33 7080人阅读 评论(5) 收藏 举报 debuggingmfcfunctionmenumicrosoftdll My Not ...

  6. [javaSE] 注解-JDK中的注解

    java中的常见注解 jdk自带注解:@Override 覆盖  @Deprecated 过期  @Suppvisewarnings 压制警告 package com.tsh.ano; public ...

  7. Socket.IO 1.0 正式发布,快速可靠的实时引擎

    Socket.IO 是目前 Web 领域最火的实时引擎,用于实现基于事件的双向实时的通信.它适用于任何平台,浏览器或设备,专注于可靠性和速度.您可以将数据推送到客户端,并获得实时的计数,日志或图表. ...

  8. 安装Oracle JDK 7.0与8.0 for Mac OS X后Eclipse启动报错的解决之道

    启动 Eclipse 时,直接报错The JVM shared library "/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Cont ...

  9. Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟

    最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 环境&版本信息声明 运行ng -v @angular/ ...

随机推荐

  1. 中国地图(Highmaps)

    1.中国地图省份和市 调用的包( <script src="https://img.hcharts.cn/jquery/jquery-1.8.3.min.js">< ...

  2. 基于spring boot 2.x的websocket示例

    spring boot 2/spring 5自带了websocket,下面是最基本的示例(包括java服务端.java客户端以及js客户端) 一.pom依赖 <dependencies> ...

  3. 【转】java日志组件介绍(common-logging,log4j,slf4j,logback )

    common-logging common-logging是apache提供的一个通用的日志接口.用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, comm ...

  4. .NET上传大文件时提示Maximum request length exceeded错误的解决方法

    使用IIS托管应用程序时,当我们需要上传大文件(4MB以上)时,应用程序会提示Maximum request length exceeded的错误信息.该错误信息的翻译:超过最大请求长度. 解决方法: ...

  5. 用SSH登录远程的机器,在远程机器上执行本地机器上的脚本

    假设本地的机器IP为10.245.111.90,我们想要在10.245.111.93上执行一个保存在10.245.111.90上的脚本. 经过测试通过的命令如下: ssh root@10.245.11 ...

  6. tensorflow tfdbg 调试手段

    https://blog.csdn.net/gubenpeiyuan/article/details/82710163 TensorFlow 调试程序 tfdbg 是 TensorFlow 的专用调试 ...

  7. 1154:LETTERS

    题目链接http://bailian.openjudge.cn/practice/1154/ 总时间限制: 1000ms 内存限制: 65536kB 描述 A single-player game i ...

  8. IsDebuggerPresent原理及其 c++实现

    在IsDebuggerPresent下断,步入得到如下代码: 75 A1 | ] | eax:std::cout 75 | ] | eax:std::cout 75 | ] | eax:std::co ...

  9. Winscp使用sudo user登录

    为了安全期间, 一般设置了禁止root用户ssh登录.使用普通用户登录后再sudo获取操作权限. 可为了文件传文件使用winscp,如何使用sudo登录以获取权限传文件呢 先在服务端设置sudo帐号权 ...

  10. PhpStorm连接Docker容器配置xdebug断点调试

    本教程主要演示xdebug在PhpStorm中配置方法. 一.环境说明 1.Mac笔记本(本教程演示过程使用的是Mac OS操作系统,和windows环境是有区别的,这一点需要特别注意): 2.在Ma ...