码迷,mamicode.com
首页 > 编程语言 > 详细

10分钟学会JAVA注解(annotation)

时间:2017-05-26 00:56:55      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:实现   原理   blog   public   log   编译   get   field   retention   

(原)

先认识注解(Annotation

定义类用class,定义接口用interface,定义注解用@interface

public @interface AnnotationTest{}

所有的注解类型都自动的继承于java.lang.annotation.Annotation接口

 技术分享

 

Annotation接口文档中这样描述:所有注解类型都扩展于这个公共的接口,注意,一个接口,

手动的继承了这个接口,并不意味着它是一个注解类型。换句话说,这个接口本身不是一个注解类型。

 

注意:这里Annotation是个接口,不是注解,注解是不能继承的

 

@Retention:保留注解

 技术分享

 

里面有一个RetentionPolicy保留策略的枚举属性

 技术分享

 

这里有三个值:

SOURCE:注解会被编译器丢弃,不会被编译到.class文件中

CLASS:在编译时,注解会被保留在.class编译文件中,但是不会被虚拟机读取,这是一个预设值。

RUNTIME:注解会被保留在.class编译文件中,并且可以被虚似机在运行时获取到,所以他们能以反射的方式读取。

 

例如:平常编译代码时,用来压制IDE警告的注解@SuppressWarnings

重写的注解@Override

 技术分享

技术分享

 

 

被注解为SOURCE,这二个注解只会在编译期运行,不会被编译进.class文件

如果注解需要用到反射,那么必需了解AnnotatedElement

 技术分享

(以上实现是1.6版本的JDK1.8版本已经改了,添加了几个,这里就不列出来了。)

注意:如果需要用到反射,一定要定义@Retention的值为RUNTIME,因为他的默认值是CLSS

 

下面一个例子来认识注解怎么用,注解写的很清楚了,就不多说了。

这里定义了一个注解@AnnotationTest

 技术分享

技术分享

 

下面介绍另一个重要的注解

@Target

 技术分享

@Retention一样,也有一个枚举类型的属性

 技术分享

这里值有很多,比如METHOD,这个值只能修饰方法,FIELD,这个值只能修饰属性等

比如说我将刚才自己写的注解加上@Target({ElementType.FIELD})

 技术分享

那么刚才的这个地方就会报错

 技术分享

提示我这个注解不允许放在这个地方。

 

JAVA注解有很多,实际开发中很少会自己去写,都是用的第三方或是框架的,只要知道其基本原理,其实这些东西都很简单。

10分钟学会JAVA注解(annotation)

标签:实现   原理   blog   public   log   编译   get   field   retention   

原文地址:http://www.cnblogs.com/LeeScofiled/p/6906351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!