java注解与反射

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java的注解与反射

最近在学jdk1.5的新特性,看到注解部分难以理解,不明白到底有什么用处,但与反射接合起来看,就不难看出它的作用之一:代码分析,即使用反射提取java成分的注解,生成日志,便于查看以分析自己编写的代码。

我们先来看看注解的分类:元注解、自定义注解。

其中,元注解就是“用于注解的注解”,@Target、@Retention、@Documented、@Inherited,这些注解被包含在ng.annotation 包中,下面我们简要说明这四种注解的作用,其中的具体参数就靠各位自己去百度了。

@Target用于说明注解所修饰的对象范围,注解可以被用来修饰包、类、接口、成员方法、构造器、成员字段、方法参数、枚举值、Annotation类型;@Retention用于定义该自定义注解被保留的时间长短;@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员;@Inherited 元注解是一个标记注解,如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类(注意:

@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。

如果我们使用ng.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层);@Override用于标明方法是被重载的,若所标注的方法没有被重载则编译器报错;@SuppressWarnings用于消除编译器的警告;@Deprecated用于已经过期不用的类。

那么什么是“自定义注解”?

先举个例子,看下面代码:

当然,这段代码没有任何实际作用,内部没有变量,那么我需要先向其中添加变量,如下所示:

定义了注解,我们就需要在自己定义的java成分中使用这些注解。例如我将这个注解用在如下类中:

这样就完了?不!还有一步,如果没有注解处理器,那么这些自定义注解可以说是没有任何用处的。注解处理器实际上就是利用了反射机制,获取java成分中的注解信息,由此我们可以分析代码的运行过程。

以上是注解处理器的简单实例,在实际工作中可以使用I/O流将项目的执行过程输出到日志文件中保存,然后可以查看自己的日志,

了解程序的运行,便于调试、分析代码。

相关文档
最新文档