以下内容参考java编程思想-4,jdk版本为jdk5.0,有点老-_-|||

什么是注解

JAVA SE5引入,也称元数据,可以直接添加到代码中,用来完整描述程序所需的信息,而这些信息是无法用Java来表达的;

内置注解

jdk5.0中内置了三种标准注解和四种元注解;

三种标准注解,定义在java.lang中:

@Override  //表示子类方法覆盖父类方法

@Deprecated //已过时,不建议使用的API

@SuppressWarnings //取消编译器警告

四种元注解:

@Target  //指定该注解可以用在什么地方

可选参数:

CONSTRUCTOR:构造器声明

FIELD:域声明

LOCAL_VARIABLE:局部变量声明

METHOD:方法声明

PACKAGE:包声明

PARAMETER:参数声明

TYPE:类、接口声明

@Retention //表明该注解在哪一级别可用

可选参数:

SOURCE:注解将被编译器丢弃;

CLASS:注解在class文件中可用,但会被VM丢弃;

RUNTIME:VM在运行期间也保留注解,可以通过反射机制读取注解信息;

@Documented//表明将此注解包含在Javadoc中

@Inherited //允许子类继承父类的注解

基本语法

自定义注解

标记注解

定义一个@Test注解,如下代码所示,可以看到,注解的定义与接口类似,事实上注解与接口一样,也会被编译成class文件;

package annotations;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test { }

在注解中,一般都会包含一些元素以表示某些值,当分析处理注解时,程序可以读取这些值;

上面的@Test注解不包含元素,被称为标记注解;

包含元素的注解

下面代码定义了一个包含元素的注解,元素的定义类似于方法,定义中包含了元素的数据类型,如下,id为int类型,description为String类型,且包含一个默认值;

package annotations;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
public int id(); public String description() default "no description";
}

注意,注解元素可用的类型如下:

所有的基本数据类型(int,double...)

String

Class

enum

Annotation

数组(以上类型为元素)

如果使用其它类型编译器会报错,特别提醒,Integer,Double等基本数据类型的包装类型也是不允许的;

另外,元素是不能有不确定的值,要么有默认值,要么提供元素的值,且不能为null;

注解使用

上面定义的@UseCase注解的使用如下所示,很简单,在方法前面写上注解,并指定元素的值,如果未指定的话将使用默认值;

package annotations;

import java.util.*;

public class PasswordUtils {
@UseCase(id = 47, description = "Passwords must contain at least one numeric")
public boolean validatePassword(String password) {
return (password.matches("\\w*\\d\\w*"));
} @UseCase(id = 48)
public String encryptPassword(String password) {
return new StringBuilder(password).reverse().toString();
} @UseCase(id = 49, description = "New passwords can't equal previously used ones")
public boolean checkForNewPassword(List<String> prevPasswords, String password) {
return !prevPasswords.contains(password);
}
}

编写注解处理器

利用JAVA的反射机制,可以查找注解标记,下面是一个简单的注解处理器,用于解析上面提到的@UserCase注解,主要使用到了Class类的getDeclaredMethods()方法和Method类的getAnnotation(Class<T> annotationClass)方法;getDeclaredMethods返回类中声明的所有方法,getAnnotation返回指定的注解;

package annotations;

import java.lang.reflect.*;
import java.util.*; public class UseCaseTracker {
public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
for (Method m : cl.getDeclaredMethods()) {
UseCase uc = m.getAnnotation(UseCase.class);
if (uc != null) {
System.out.println("Found Use Case:" + uc.id() + " "
+ uc.description());
useCases.remove(new Integer(uc.id()));
}
}
for (int i : useCases) {
System.out.println("Warning: Missing use case-" + i);
}
} public static void main(String[] args) {
List<Integer> useCases = new ArrayList<Integer>();
Collections.addAll(useCases, 47, 48, 49, 50);
trackUseCases(useCases, PasswordUtils.class);
}
}

注解常见使用场景

描述数据库表结构与类关系映射(hibernate...)

单元测试(junit...)

一些配置等(spring...)

...

JAVA中的注解小结的更多相关文章

  1. java中的注解(Annotation)

    转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到 ...

  2. java中元注解

    java中元注解有四个: @Retention @Target @Document @Inherited:  @Retention:注解的保留位置 @Retention(RetentionPolicy ...

  3. java中的注解详解和自定义注解

    一.java中的注解详解 1.什么是注解 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override public Str ...

  4. 【java】细说 JAVA中 标注 注解(annotation)

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用 下面我们来详细说说这个注解,到底是怎么一 ...

  5. java中的注解总结

    1. 什么是注解 注解是java5引入的特性,在代码中插入一种注释化的信息,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解.注解也叫元数据(meta data).这些注解信 ...

  6. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  7. Java中的注解基础

    一.元注解 元注解的作用就是负责注解其他注解. 1.@Target @Target用来指明注解所修饰的目标,包括packages.types(类.接口.枚举.Annotation类型).类型成员(方法 ...

  8. java 中的equals()小结

    转载自http://www.cnblogs.com/jackyrong/archive/2006/08/20/481994.html Java中的equals是十分重要的,和= =要区别开来,最近在看 ...

  9. 【转载:java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

随机推荐

  1. 【C#】让工具栏ToolStrip能触发焦点控件的Leave、Validating、DataError等事件以验证数据

    ----------------更新:2014-04-21--------------- 蒙doggo兄指教,得知有更好的方法可以代替蹩脚的0尺寸Button法,即调用窗体的验证方法Form.Vali ...

  2. 孙鑫MFC学习笔记2:C++回顾

    1.通常可以把实例与对象等同起来 2.函数重载是发生在同一个类中的 3.函数的覆盖是发生在父类与子类之间的(函数被覆盖后可以使用父类的类名加作用域操作符::) 4.含有纯虚函数的类叫抽象类,抽象类无法 ...

  3. 算法:求幂(python版)

    分别用迭代方法和递归方法实现求幂迭代方法的时间复杂度为O(n),空间复杂度为O(1)递归方法1的时间复杂度为O(logn),空间复杂度为O(logn)递归方法2的时间复杂度为O(n),空间复杂度为O( ...

  4. 高性能的分布式服务框架 Dubbo

    我思故我在,提问启迪思考! 1. 什么是Dubbo? 官网:http://dubbo.io/,DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的 ...

  5. swipe.js 2.0 轻量级框架实现mobile web 左右滑动

    属性总结笔记如下: <style> .swipe { overflow: hidden; //隐藏溢出 清楚浮动 visibility: hidden; //规定元素不可见 (可以设置,当 ...

  6. 泛函编程(29)-泛函实用结构:Trampoline-不再怕StackOverflow

    泛函编程方式其中一个特点就是普遍地使用递归算法,而且有些地方还无法避免使用递归算法.比如说flatMap就是一种推进式的递归算法,没了它就无法使用for-comprehension,那么泛函编程也就无 ...

  7. 比特币Bitcoin源代码安装编译

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; }        比特币 (货币符号: ฿;英文名:Bitcoin;英文 ...

  8. 利用FileStream实现多媒体文件复制

        利用FileStream实现多媒体文件复制的主要思路在于利用两个FileStream对象,一个读取字节,另一个对象写入字节既可.     涉及知识点: 1.通常我们操作的File类,FileS ...

  9. [iOS] 建立与使用Framework

    [iOS] 建立与使用Framework 前言 使用XCode开发iOS项目时,开发人员可以将可重用的程序代码,封装为Library或是Framework来提供其他开发人员使用.这两种封装方式在使用的 ...

  10. 【HTML5】<datalist>标签和<select>标签的比较

    <select>标签: 注:该标签定义了下拉列表的实现 <select name = "location"> <option value = &quo ...