JAVA中的注解小结
以下内容参考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中的注解小结的更多相关文章
- java中的注解(Annotation)
转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到 ...
- java中元注解
java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy ...
- java中的注解详解和自定义注解
一.java中的注解详解 1.什么是注解 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override public Str ...
- 【java】细说 JAVA中 标注 注解(annotation)
Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用 下面我们来详细说说这个注解,到底是怎么一 ...
- java中的注解总结
1. 什么是注解 注解是java5引入的特性,在代码中插入一种注释化的信息,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解.注解也叫元数据(meta data).这些注解信 ...
- 【java】详解java中的注解(Annotation)
目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...
- Java中的注解基础
一.元注解 元注解的作用就是负责注解其他注解. 1.@Target @Target用来指明注解所修饰的目标,包括packages.types(类.接口.枚举.Annotation类型).类型成员(方法 ...
- java 中的equals()小结
转载自http://www.cnblogs.com/jackyrong/archive/2006/08/20/481994.html Java中的equals是十分重要的,和= =要区别开来,最近在看 ...
- 【转载:java】详解java中的注解(Annotation)
目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...
随机推荐
- WinPhone学习笔记(四)——磁贴
对每个Windows Phone的使用者来说,给他们的第一印象就是大大小小的磁贴——Metro,本篇介绍的是Windows Phone的磁贴,提到的有开始菜单的磁贴,也有在App里面的磁贴. 开始菜单 ...
- linux两个文件修改主机名
linux修改主机名的方法 用hostname命令可以临时修改机器名,但机器重新启动之后就会恢复原来的值. #hostname //查看机器名#hostname -i //查看本机器名对应的ip ...
- C#操作word或excel及水晶报表,检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005
解决办法一:<转自http://www.cnblogs.com/Sue_/articles/2123372.html> 具体解决方法如下: 1:在服务器上安装office的Excel软件. ...
- Oracle Database 11g For Windows7 旗舰版的安装
系统环境:win7 32位系统 安装步骤: 1,Oracle(甲骨文)官网下载适合自己的数据库安装包,下载地址http://www.oracle.com/technetwork/cn/indexes/ ...
- Linux学习笔记17--Linux系统启动详解
多数操作系统的启动流程: BIOS启动自检 ->MBR引导->执行引导程序GRUB->加载内核->执行init->runlevel BIOS(Basic Input ...
- Linux 学习手记(6): 磁盘、分区、MBR与GPT
1. 磁盘在LINUX中的表示 Linux所有设备都被抽象为一个文件,保存在/dev目录下 设备名称一般为hd[a-z]或者sd[a-z]([a-z]为分区号),如:hda.hdb.sda.sdb I ...
- Code First :使用Entity. Framework编程(1) ----转发 收藏
这个是在学习EF CodeFirst时发现的,对于初学者还是不错的.果断转发,方便自己以后查阅和学习. 对于学习Code First 这个教程讲解的还是很详细. 第一章:欢迎来到Code First ...
- Java2_JDK的安装和配置
什么是JDK JDK就是Java Development Kit,java开发工具包,由sun公司开发. JDK的三个版本 桌面系统或应用程序的标准版(Java 2 Platform Standard ...
- css布局模式
css布局模型在网页中,元素有三种布局模型: 流动模型(Flow) 浮动模型 (Float) 层模型(Layer) 流动Flow模型(一): 流动(Flow)是默认的网页布局模式.也就是说网页在默认状 ...
- 【web前端优化之图片模糊到清晰】看我QQ空间如何显示相片
前言 此篇文章估计不会太长,有移除首页的风险,但是老夫(称老夫是因为我们真正的叶小钗其实都100多岁啦)是不会怕滴.所以,我来了哟! 题外话:今天我们一起还看了一道前端的面试题,而后我本来还想多找几道 ...