[Java开发之路](15)注解
注解在一定程度上是把元数据与源码文件结合在一起,而不是保存在外部文档中这一大趋势之下所催生的。
因此。注解使得我们能够以将编译器来測试和验证的格式。存储有关程序的额外信息。注解能够用来生成描写叙述符文件。甚至是新的类定义。
通过使用注解。我们能够将这些元数据保存在Java源码中,并利用Annotation
API为自己的注解构造处理工具。
| 依照执行机制分类 | 描写叙述 |
| 源代码注解 | 注解仅仅在源代码中存在,编译成.class文件就不存在了 |
| 编译时注解 | 注解仅仅在源代码和.class文件里都存在(比如:@override) |
| 执行时注解 | 在执行阶段还起作用,甚至影响执行逻辑的注解(比如:@Autowired) |
其实,与其它不论什么Java接口一样,注解也会被编译成class文件。
package com.qunar.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;public class Annotation {// 定义Description注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Inherited@Documented// 使用@interface keyword定义注解public @interface Description{// 成员以无參无异常方式声明String desc();String author();// 能够使用defaultkeyword为成员指定一个默认值int age() default 18;}}
定义注解的时候会须要一些元注解。如@Target和@Retention。@Target用来定义你的注解将用于什么地方(是一个方法上还是一个类上),@Retention用来定义该注解在哪一个级别上可用(在源码上或者是类文件上或者是执行时)。详细以下解说。
- 全部基本数据类型(int,float。boolean等)
- String
- Class
- enum
- Annotation
- 以上类型的数组
注意,也不同意使用不论什么包装类型。只是因为自己主动打包的存在,这算不上什么限制。注解也能够作为元素的类型。也就是注解能够嵌套。
| 元注解 | 參数 | 描写叙述 | |
|
@Taget |
CONSTRUCTOR | 构造器的声明 |
表示注解能够用于什么地方 |
| FIELD | 域声明 | ||
| METHOD | 方法声明 | ||
| PACKAGE | 包声明 | ||
| PARAMETER | 參数声明 | ||
| TYPE | 类,接口或enum声明 | ||
| LOCAL_VARIABLE | 局部变量声明 | ||
|
@Retention |
SOURCE | 注解仅仅在源代码中存在。编译成.class文件就不存在了 |
表示须要在什么级别保存该注解信息 |
| CLASS | 注解仅仅会在.class文件存在,会被VM丢弃 | ||
| RUNTIME | VM将在执行期也保留注解。因此能够通过反射机制读取注解的信息 | ||
| @Document | 将此注解包括在Javadoc中 | ||
| @Inherited | 同意子类继承父类中的注解 | ||
package com.qunar.annotation;import com.qunar.annotation.Annotation.Description;public class Student {private String name;@Description(desc = "set name for student object" , author = "sjf0115")public String getName() {return name;}@Description(desc = "get name from student object" , author = "sjf0115", time = "2016-01-11")public void setName(String name) {this.name = name;}}
package com.qunar.annotation;import java.lang.reflect.Method;import com.qunar.annotation.Annotation.Description;public class ParseAnnotation {public static void main(String[] args){Class<? > class1 = null;try {// 使用类载入器载入类class1 = Class.forName("com.qunar.annotation.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}// 推断Student类上是否有Description注解boolean isExits = class1.isAnnotationPresent(Description.class);if(isExits){// 注解实例Description desc = class1.getAnnotation(Description.class);System.out.println("注解:" + desc.toString());}//if// 获取Student类上的全部方法Method[] methods = class1.getMethods();// 遍历全部方法for (Method method : methods) {// 推断方法上是否有Description注解isExits = method.isAnnotationPresent(Description.class);if(isExits){Description description = method.getAnnotation(Description.class);System.out.println("方法注解:" + description.toString());}//if}//for}}
|
方法注解:@com.qunar.annotation.Annotation$Description(time=2016-01-12, desc=set name for student object, author=sjf0115)
方法注解:@com.qunar.annotation.Annotation$Description(time=2016-01-11, desc=get name from student object, author=sjf0115)
|
package com.qunar.annotation;import java.lang.annotation.Annotation;import java.lang.reflect.Method;import com.qunar.annotation.Annotation.Description;public class ParseAnnotation {public static void main(String[] args){Class<?> class1 = null;try {// 使用类载入器载入类class1 = Class.forName("com.qunar.annotation.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}// 推断Student类上是否有Description注解boolean isExits = class1.isAnnotationPresent(Description.class);if(isExits){// 注解实例Description desc = class1.getAnnotation(Description.class);System.out.println("注解:" + desc.toString());}//if// 获取Student类上的全部方法Method[] methods = class1.getMethods();// 遍历全部方法for (Method method : methods) {// 方法上获取全部的注解Annotation[] annotations = method.getAnnotations();for (Annotation annotation : annotations) {if(annotation instanceof Description){System.out.println("Description注解:" + annotation.toString());}//if}//for}//for}}
[Java开发之路](15)注解的更多相关文章
- 【java开发系列】—— 自定义注解
之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注 ...
- Java开发学习(十)----基于注解开发定义bean 已完成
一.环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies> <dependency> < ...
- [Java开发之路](9)对象序列化与反序列化
1. 对象序列化 当你创建对象时.仅仅要你须要.它会一直存在,可是程序终止时,不管何时它都不会继续存在.虽然这样做是很有意义的,可是在某些情况下.假设程序不执行时扔能存在而且保存其信息,那将对我们很实 ...
- [Java开发之路](16)学习log4j日志
1. 新建一个Javaproject.导入Jar包(log4j-1.2.17.jar) Jar包下载地址:点击打开链接 2. 配置文件:创建并设置log4j.properties # 设置 log4j ...
- [Java 开发利器Lombok] 常用注解演示
在以往的对象模型编码时,我们需要写一大堆的get/set以及不同的构造函数等.Lombok为我们提供了一个非常好的插件形式. 在大多数的项目中,只需要使用到以下集中Annotation就足够了,如果需 ...
- Java开发学习(十一)----基于注解开发bean作用范围与生命周期管理
一.注解开发bean作用范围与生命周期管理 前面使用注解已经完成了bean的管理,接下来将通过配置实现的内容都换成对应的注解实现,包含两部分内容:bean作用范围和bean生命周期. 1.1 环境准备 ...
- Java开发学习(十三)----基于注解开发定义第三方bean及注解开发总结
在前面的博客中定义bean的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar包中,我们没有办法在类上面添加注解,这个时候该怎么办? 遇到上述问题,我们就需要有一种更加 ...
- [Java开发之路](8)输入流和输出流
1. Java流的分类 按流向分: 输入流: 能够从当中读入一个字节序列的对象称作输入流. 输出流: 能够向当中写入一个字节序列的对象称作输出流. 这些字节序列的来源地和目的地能够是文件,并且通常都是 ...
- [Java开发之路](23)装箱与拆箱
1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...
随机推荐
- 【Todo】Zookeeper系列文章
http://nileader.blog.51cto.com/1381108/1068033
- ios 获取手机信息(UIDevice、NSBundle、NSLocale)
iOS的SDK中提供了UIDevice.NSBundle,NSLocale. UIDevice UIDevice提供了多种属性.类函数及状态通知,帮助我们全方位了解设备状况. 从检測电池 ...
- 题目1205:N阶楼梯上楼问题(2008年华中科技大学计算机保研机试真题:递推求解)
题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2447 解决:927 题目描写叙述: N阶楼梯上楼问题:一次能够走两阶或一阶,问有多少种上楼方式. (要求 ...
- java 文件读写--转载
读文件 http://www.baeldung.com/java-read-file Java – Read from File 1. Overview In this tutorial we’ll ...
- 深度解析VC中的消息
消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情 ...
- ECMALL功能拓扑图以及模式分析
ECMALL VS 常规的B2C产品(以ECSHOP做对比)的区别: 1.支持多用户在同一个域名下开店. 2.开店的卖家各自结算,直接收钱.平台只是提供了一个类似传统行业的摊位.平台不过手金钱 3 ...
- c编程:僵尸吃大脑
第一行输入一个正整数n 以下每一行输入僵尸已经吃了的大脑数量a,和需要生存必需要吃的大脑数量b.总共n行. 例子输入 3 4 5 3 3 4 3 例子输出 NO BRAINS MMM BRAINS M ...
- UVA 10391 - Compound Words 字符串hash
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- cordova android
Image.png Image.png http://www.jscss.cc/2016/10/18/cordova.html 装一个全局的cordova: 官网介绍:http://cordova.a ...
- C# 进制转换 在什么情况下使用16进制,字节数组,字符串
C# 进制转换 Admin2013年9月18日 名人名言:从工作里爱了生命,就是通彻了生命最深的秘密.——纪伯伦 1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Con ...