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.什么是注解 用一个词就可以 ...
随机推荐
- WinForm 简单蒙版实现控件遮盖
在Web上面要实现一个遮罩层或者说是蒙版吧,有了DIV那不算什么难事,只要给div定好位置和大小,把颜色的Alpha值设一下就有透明的效果.不过在Winform中实现起来就没那么简单了事.尝试过用一个 ...
- PowerDesigner中Table视图怎样同时显示Code和Name
1.创建一个简单table视图步骤: 1)打开软件,创建model,选择Physical Data
- MySQL Cursor
MySQL Cursor Summary: in this tutorial, you will learn how to use MySQL cursor in stored procedures ...
- java Servlet(续)
一.web.xml配置 由于需用户需要通过URL访问架设好的Servlet,所以我们必须将servlet映射到一个URL地址上, 比如上面的配置文件我们就可以通过:http://localhost:8 ...
- ahjesus code simith 存储过程模板
<%------------------------------------------------------------------------------------------ * Au ...
- mysql易混淆知识点
1,join 和 union join连接属于表之间的水平操作,而union 是表之间的垂直操作.简单讲就是水平操作主要是为了获得列数据,垂直操作是为了获得行数据 cross join ...
- Redis-持久化
Redis 持久化 Redis 提供了不同持久化范围的选项: RDB 持久化以指定的时间间隔执行数据集的即时点(point-in-time)快照. AOF 持久化在服务端记录每次收到的写操作,在服务器 ...
- jquery+jplayer实现歌词同步的mp3音乐播放器效果
实例预览 下载地址 实例代码 <div class="container"> <div class="demo"> <textar ...
- Awesomplete - 零依赖的简单自动完成插件
Awesomplete 是一款超轻量级的,可定制的,简单的自动完成插件,零依赖,使用现代化标准构建.你可以简单地添加 awesomplete 样式,让它自动处理(你仍然可以通过指定 HTML 属性配置 ...
- 自定义Sublime Text图标详细教程
改造后的Sublime 先看看我改造后的神器图标,接下来你就知道下面是干什么的了 : 之前无意间在刘哇勇的博客上看到这么一篇文章,很好奇就尝试着更改Sublime Text ...