- 浏览: 85213 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
zhtch_123:
hold_on 写道zhtch_123 写道可以,使用apk的 ...
Android插件式开发(一) -
hold_on:
zhtch_123 写道可以,使用apk的静默安装那还是要安装 ...
Android插件式开发(一) -
zhtch_123:
可以,使用apk的静默安装
Android插件式开发(一) -
hold_on:
xingzhe321655 写道这个思路不错,但是每安装一个插 ...
Android插件式开发(一) -
zhtch_123:
很久没有用了,现在要用了,来复习一下。不论ssh怎么更新版本, ...
SSH 架构
Java Annotation 浅析
1. 定义
annotate 英文里面注解的意思。Java annotation 又称为java 内注( 内建) 的意思。从sun 官方网站上面看到关于java 内注的定义:java 内注提供了关于代码的一些数据( 注解), 它本身不是java 代码的一部分。它不能直接影响它注释的代码的运行。java 在jdk5 之前本身提供了一些专门的注解机制( 如transient :防止序列化) 。
网上看到的另外的一些定义:Annotation 提供了一条与程序元素关联任何信息或者任何元数据(metadata )的途径。从某些方面看,annotation 就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中。这些信息被存储在annotation 的“name=value” 结构对中。 annotation 类型是一种接口,能够通过java 反射API 的方式提供对其信息的访问。
2. 按功能分类 Annotations
java 的内注有些是给编译器使用的,有些是运行时可调用的关于其功能的分类可参考:
Sun 官网里关于 Annotations 的分 类:
1.( 为编译起提供信息)information for the compiler :为编译器提供信息,如编译器可以用来检查错误和忽略警告。
2.( 编译时或部署时处理)Compiler-time and deployment-time processing :可以让软件工具通过处理内注信息来产生代码、xml 文件等等。
3.( 运行时处理)runtime processing( 运行时处理) :有一些特殊的内注可以在运行时进行处理。
java5 本身提供了供编译器自己使用的几个内注,先来理解下这几个内注:
Annotations Used by the Compiler:
@Deprecated : 用来告诉编译器这个方法已经被遗弃了不再维护,当有代码引用该方法时,会提示。
@Override : 用来告诉编译器,该方法重写了父类的某个方法。这个有的时候有助于查找拼写错误。如果用了才标记,但是父类却没有该方法,则会报错。
@SuppressWarnings : 用来告诉编译器忽略一些警告。@SuppressWarnings({"unchecked", "deprecation"}) 用于忽略unchecket 和deprecation 的警告。
这几个是java 内部定义好的一些内注,我们平常在编写代码时候应该都有接触到。我们也可以自己定义内注,请继续看下面的章节。
3. 语法和使用
此功能由一个定义annotation 类型的语法和一个描述annotation 声明的语法,读取annotaion 的API ,一个使用annotation 修饰的class 文件,一个annotation 处理工具(apt )组成。
3.1 格式
Annotation 类型声明于一般的接口声明极为类似,区别只在于它在interface 关键字前面使用“@” 符号。Annotation 类型可以由>=0 个的类型成员组成。Annotation 的类型成员由类型和成员方法组成,成员方法是一个空的方法,方法名即是其成员名。类型只能是primitives 、String 、Class 、enums 、annotation 和前面类型的数组。可以有默认值。 如下几个例子涵盖了基本的语法:
例子1:
package annotation;
public @interface Copyright {
String value();
}
定义了一个内注,只有一个名为 value, 类型为 String 的成员。
例子2:
package annotation;
public @interface Preliminary {
}
定义了一个空的内注,又称为 MarkAnnotation, 标记内注, (java 的 @overide 就是一个标记内注 )
例子 3:
package annotation;
public @interface annotest {
int id();
String synopsis();
String engineer() default "[unassigned]" ;// 默认值是 unassigned
String date() default "[unimplemented]" ;
}
定义了一个有多成员的内注,且有些有默认值。
例子 4:
import java.lang.annotation.*;
/**
* Indicates that the annotated method is a test method. This annotation should
* be used only on parameterless static methods.
*/
@Retention (RetentionPolicy. RUNTIME )// 声明了这是一个运行时的內注, java 虚拟机不会抛弃它
@Target (ElementType. METHOD )// 声明了该内注只对方法有用
public @interface Test {
}
例子 5:
package test;
public @interface UncheckedExceptions {
Class<? extends RuntimeException>[] value();
}
内注是个 Class 的数组类型。
3.2 内注的类型
关于内注的类型主义以下几点:
1. 普通annotation
有成员的annotation
2.
marker annotation
类型
一个没有成员定义的annotation
类型被称为marker annotation
。这种annotation
类型仅使用自身的存在与否来为我们提供信息。如Override
。
3.meta-annotation
:
meta -annotation
也称为元annotation
,它是被用来声明annotation
类型的annotation
。Java5.0
提供了一些标准的元-annotation
类型。如:
[target]
annotation
的target
是一个被标注的程序元素。target
说明了annotation
所修饰的对象范围:annotation
可被用于packages
、 types
(类、接口、枚举、annotation
类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch
参数)。在annotation
类型的声明中使用了target
可更加明晰其修饰的目标。
[retention]
annotation
的retention
定义了该annotation
被保留的时间长短:某些annotation
仅出现在源代码中,而被编译器丢弃;而另一些却被编译在 class
文件中;编译在class
文件中的annotation
可能会被虚拟机忽略,而另一些在class
被装载时将被读取(请注意并不影响class
的执行,因为annotation
与class
在使用上是被分离的)。使用这个meta-annotation
可以对annotation
的“生命周期” 限制。
上面的例4 里声明的test 就是使用了@Retention (RetentionPolicy. RUNTIME ) 和
@Target (ElementType. METHOD ) 两个元内注进行声明的内注。前者是为了让内注能在运行时被处理,后者说明了该内注是用来修饰方法的。
3.3 内注的使用
标注的使用很简单,就是在要修饰的地方前面加上内注。
使用标准Annotation
@Override
public String toSting() { // 注意方法名拼写错了
return "[" + super.toString() + "]";
}
本方法编译器会报错,因为使用了@Override标注之后编译器会检查父类是否有被重写的方法。显然上面的方法拼写错误,所以就会报错。
自定义内注使用
定义:
package annotation;
import java.lang.annotation.*; // import this to use @Documented
@Documented
public @interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A" ;
String lastModifiedBy() default "N/A" ;
String[] reviewers(); // Note use of array
}
使用:
@ClassPreamble (author = "John Doe" , date = "3/17/2002" , currentRevision = 6, lastModified = "4/12/2004" , lastModifiedBy = "Jane Doe" , reviewers = {
"Alice" , "Bob" , "Cindy" } // Note array notation
)
public class TestAnno {
}
该内注提供了一个注释的模板。
3. 运行时处理内注
内注定义:
package test;
import java.lang.annotation.*;
/**
* Indicates that the annotated method is a test method. This annotation should
* be used only on parameterless static methods.
*/
@Retention (RetentionPolicy. RUNTIME )
@Target (ElementType. METHOD )
public @interface Test {
}
使用 :
package test;
public class Sample {
@Test
public static void m1() {
}
public static void m2() {
}
@Test
public static void m3() {
throw new RuntimeException( "Boom" );
}
public static void m4() {
}
@Test
public static void m5() {
}
public static void m6() {
}
@Test
public static void m7() {
throw new RuntimeException( "Crash" );
}
public static void m8() {
}
public static void m9() {
}
}
测试:
package test;
import java.lang.reflect.*;
public class RunTests {
public static void main(String[] args) throws Exception {
int passed = 0, failed = 0;
for (Method m : Class. forName (args[0]).getMethods()) {
if (m.isAnnotationPresent( Test . class )) {
try {
m.invoke( null );
passed++;
} catch (Throwable ex) {
System. out
.printf( "Test %s failed: %s %n" , m, ex.getCause());
failed++;
}
}
}
System. out .printf( "Passed: %d, Failed %d%n" , passed, failed);
}
}
运行 :java RunTests test.Sample 的结果如下:
Test public static void test.Sample.m3() failed: java.lang.RuntimeException : Boom
Test public static void test.Sample.m7() failed: java.lang.RuntimeException : Crash
Passed: 2, Failed 2
从代码和结果可以看到,通过 Java 反射可以访问声明为 RetentionPolicy.RUNTIME 类型的 java 内注 .
完!
本文部分内容参考了 :
http://www.blogjava.net/ericwang/archive/2005/12/13/23743.html
http://www.blogjava.net/mlh123caoer/archive/2007/09/06/1432
发表评论
-
Android插件式开发(一)
2012-08-30 17:45 37881.插件式开发基础 插件式开发是指,只要提供一个 ... -
使用VideoView播放rtsp视频流
2012-08-21 18:21 53721.视频播放控制 package com.exampl ... -
Log4J学习总结
2009-07-25 19:59 674Log4J 学习笔记 ... -
Java Enum 学习
2009-07-29 16:45 636Java Enum 学习 1. ... -
Java ThreadLocal使用浅析
2009-08-18 20:14 763Java ThreadLocal使用 ... -
Java 线程池ThreadPoolExecutor
2009-09-01 13:12 757Java 线程池 ThreadP ... -
JVM学习序列之一:Java Class文件结构分析
2009-12-06 16:43 710Java Class文件结构分析 学习 Ja ... -
DbUnit 简介和使用 (puts your database into a known state)
2009-12-16 17:06 730DbUnit 简介 1. ... -
Java反射之Method调用和Filed设置
2010-01-24 14:13 701反射是java的一个高级特 ... -
java float double精度为什么会丢失?浅谈java的浮点数精度问题
2010-02-27 21:46 795由于对float或double 的使用不当,可能会出现精度丢 ... -
Java反射之JDK动态代理实现简单AOP
2010-04-04 13:52 502JDK动态代理实现简单AOP ... -
java字符编码原理浅析
2010-05-09 15:10 346本周遇到一个java乱码问题,于是对java的编码问题做 ... -
java字符编码原理浅析
2010-05-09 15:10 662本周遇到一个java乱码问题,于是对java的编码问题做 ... -
Eclipse RCP中使用Swing组件(转载)
2012-01-30 20:16 967http://twaver.servasoft.com/?ta ...
相关推荐
### Java Annotation 概述与应用 #### 一、Java Annotation 的定义及作用 Java Annotation(注解)是自 Java 5.0 开始引入的一种语言元素,它为开发者提供了在代码中添加元数据的能力。简单来说,注解就像是对代码...
Java Annotation 是 JDK5.0 引入的一种元数据机制,它允许程序员在代码中嵌入额外的信息,这些信息可以被编译器、构建工具或运行时系统用来执行特定的任务。Annotation 提供了一种安全、灵活的方式来描述代码的属性...
Java 注解(Annotation)是Java语言提供的一种元编程机制,它允许程序员在源代码的各个元素(如类、方法、变量等)上添加信息。这些信息可以被编译器或运行时系统用来验证代码、执行特定操作或者提供额外的运行时...
《Java Annotation手册》 在Java编程语言中,注解(Annotation)是一种元数据,它提供了在编译时或运行时处理代码的一种方式。通过注解,开发者可以向编译器或JVM提供有关代码的附加信息,而这些信息通常不直接影响...
Java的`javax.annotation.processing.Processor`接口定义了注解处理器的规范。 5. 使用注解 注解可以应用于类、方法、字段、参数、构造函数、包等不同级别。例如: ```java @MyAnnotation("Hello, World!") ...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是关于数据的数据,可以提供额外的信息,这些信息虽然不是程序运行所必需的,但能够帮助编译器、JVM(Java虚拟机)或工具更好...
Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,用于向编译器、JVM或工具提供有关代码的附加信息。这些信息不直接影响代码的执行,但可以被编译器或运行时环境用来执行特定的操作,如代码分析、...
Java Annotation注解技术是自Java SE 5.0版本引入的一种元编程机制,它允许程序员在源代码的各个层面(如类、方法、变量等)添加元数据,以供编译器、JVM或第三方工具在编译时或运行时进行处理。Annotation简化了...
如果你想知道java annotation是什么?你可以看看
Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,可以提供有关代码的附加信息,而这些信息并不直接影响代码的执行。在Java中,注解用于向编译器、JVM或...
【Java Annotation手册】 Java Annotation是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,这些元数据不直接影响程序的运行,但可以被编译器、工具或运行时环境用来验证代码、生成文档、实现依赖...
Java 注解(Annotation)是Java语言的一个重要特性,它为代码提供元数据,即关于代码的信息,但这些信息不直接影响程序的运行。注解在Java中主要用于编译器检查、运行时处理、框架生成元数据等场景。本篇将深入探讨...
Java Annotation是Java编程语言中的一种特性,用于向编译器、虚拟机或其他工具提供元数据。在《Java Annotation入门》的基础上,这篇手册深入探讨了Annotation的定义、使用和功能。 一、Annotation的本质 ...
Java Annotation学习整理
【Java Annotation 实例】 Java Annotation 是一种元数据,它允许我们在源代码中嵌入信息,这些信息可以被编译器或运行时环境用于处理代码。Annotation 不是代码本身,但可以影响代码的行为或提供编译时和运行时的...
3. **Java注解(Annotation)**: - Java注解是元数据的一种形式,用于提供有关代码的信息,而这些信息可以被编译器或运行时环境用来执行某些操作。在Struts2中,注解广泛用于简化配置,如`@Action`、`@Result`、`@...