您的位置:首页 > 编程语言 > Java开发

从入门到精通:让人又爱又恨的注解(一)

2016-07-21 20:23 302 查看

注解和其他信息配置的区别

注解是一种配置,信息和程序的分离。 从而利用信息改变程序的流程。 注解和xml,或者properties文件有相似的作用,但是又不相同。

相同点: 都是为了在程序运行前,设定一些信息, 运行时给编译器,给其他客户程序读取,进而改变程序的流程。

不同点: xml等配置文件,修改之后不需要重新编译java文件,但是注解本身就编写在java类文件中,被jvm读取,并存放到内存中。因此修改之后,需要重新编译java文件。

注解能做什么

从class文件规范中可以看出,jdk5开始,class文件已经引入了注解描述片段。站在java虚拟机的角度来看,class保留和运行时保留的注解已经和java二进制码放在了同等的地位。虚拟机在加载class文件时,会为注解内容分配空间并进行解析,最终还会为注解和对应的二进制码简历关联。尽管这些注解不会被运行,但其对代码的说明能力,结合反射技术已经足够我们做太多的事情。

注解的语法规则

@interface
用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。可以通过
default
来声明参数的默认值。

且在
@interface
之前,需要通过元注解来描述该注解的使用范围(
@Target
),生命周期(
@Retention
)及其他
@Target
用于描述注解的使用范围(即: 被描述的注解可以用在什么地方),类型有:

CONSTRUCTOR
FIELD
LOCAL_VARIABLE
PACKAGE
PARAMETER
TYPE


@Retention
用于描述注解的生命周期(即:被描述的注解在什么范围内有效),其取值有:

SOURCE 在源文件中有效

CLASS 在class文件中有效

RUNTIME 在运行时有效

package com.chdsxt.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface Table {
public String value()  default "";//default表示默认值
public String name()  default "";//意义上来说 更像是一个属性
}


public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }

这是一个enum类型,共有三个值,分别是SOURCE,CLASS,RUNTIME

SOURCE代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。

CLASS的意思是这个Annotation类型的信息只会保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这些信息加载到虚拟机中去,注意: 当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS。

第三个是, 是RUNTIME,表示在源码,编译好的.class文件中保留信息,在执行的时候会把这些信息加载到jvm中去的。

元注解

public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }


这是一个enum类型,共有三个值,分别是SOURCE,CLASS,RUNTIME

SOURCE代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。

CLASS的意思是这个Annotation类型的信息只会保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这些信息加载到虚拟机中去,注意: 当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS。

第三个是, 是RUNTIME,表示在源码,编译好的.class文件中保留信息,在执行的时候会把这些信息加载到jvm中去的。

public  enum ElementType  {TYPE, FIELD ,METHOD ,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE ,PACKAGE}


这个用来表示注解的类型,就是可以放置的地方

注意: 如果一个Annotation类型没有指名@Target使用在哪些元素上,那么它可以使用在任何元素之上,这里的元素指的是上面的七种类型。

TYPE: 用于描述类或者接口

Field: 用于描述类的属性

Method: 用于描述类的方法

Parameter: 用于描述方法的参数

Constructor: 用于描述构造器

Local_variable: 用于描述局部变量

Package: 用于描述包

另外,在定义个自定义注解的时候,,有两个元注解的需要特殊注意的。

@Documented
让这个
Annotation
类型的信息能够显示在javaapi说明文档上; 没有添加的话,使用javadoc生成api文档的时候就会找不到这个类型生成的信息。

@Inherited
如果需要把
Annotation
的数据继承给子类,那么就会用到
@Inherited
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  注解 java