黑马程序员技术交流社区

标题: 关于自定义注解的问题 [打印本页]

作者: kevinmesss.tz    时间: 2014-3-31 09:50
标题: 关于自定义注解的问题
如果自定义注解的时候没有用元注解修饰
那么自定义注解@Retention 和 @Target的默认值是什么
作者: 清风木扬    时间: 2014-3-31 10:25
1,@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
----RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉
----RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
----RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
2,@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
----ElementType.CONSTRUCTOR: 构造器声明
----ElementType.FIELD: 成员变量、对象、属性(包括enum实例)
----ElementType.LOCAL_VARIABLE: 局部变量声明
----ElementType.METHOD: 方法声明
----ElementType.PACKAGE: 包声明
----ElementType.PARAMETER: 参数声明
----ElementType.TYPE: 类、接口(包括注解类型)或enum声明
作者: kevinmesss.tz    时间: 2014-3-31 13:01
清风木扬 发表于 2014-3-31 10:25
1,@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
-- ...

谢谢了!这个默认值去哪里查,我看了Retention和Target源码里面都只有一个枚举,枚举里面也没有说明哪个是默认值啊
作者: Saner    时间: 2014-3-31 15:51
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。
1、元注解
元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种。
1.1、@Retention: 定义注解的保留策略
@Retention(RetentionPolicy.SOURCE)    //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)      // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)   // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
1.2、@Target:定义注解的作用目标
其定义的源码为:
1 @Documented
2 @Retention(RetentionPolicy.RUNTIME)
3 @Target(ElementType.ANNOTATION_TYPE)
4 public @interface Target {
5     ElementType[] value();
6 }

@Target(ElementType.TYPE)    //接口、类、枚举、注解

@Target(ElementType.FIELD)  //字段、枚举的常量

@Target(ElementType.METHOD)  //方法

@Target(ElementType.PARAMETER)  //方法参数

@Target(ElementType.CONSTRUCTOR)   //构造函数

@Target(ElementType.LOCAL_VARIABLE) //局部变量

@Target(ElementType.ANNOTATION_TYPE) //注解

@Target(ElementType.PACKAGE) / //包   

由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等

1.3、@Document:说明该注解将被包含在javadoc中

1.4、@Inherited:说明子类可以继承父类中的该注解
2、java 注解的自定义
@Retention(RetentionPolicy.RUNTIME)

定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。

@Target({ElementType.TYPE,ElementType.METHOD})

因此这个注解可以是类注解,也可以是方法的注解

这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等

作者: 清风木扬    时间: 2014-3-31 18:13
kevinmesss.tz 发表于 2014-3-31 13:01
谢谢了!这个默认值去哪里查,我看了Retention和Target源码里面都只有一个枚举,枚举里面也没有说明哪个 ...


定义一个注解,再定义注解类(@Target值没修改可以到处放),
再定义一个对注解类进行反射的类(@ Retention“注解生命区间”值没修改时,反射不出注解类上的注解。)
参观视屏“34,35_黑马程序员_张孝祥_Java基础加强_注解的定义与反射调用.avi”




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2