- 浏览: 367842 次
- 性别:
- 来自: 青岛
-
文章分类
最新评论
-
lippeng:
楼主,你好!这篇中提到的一个话题,是我现在非常关心的,我自己还 ...
使用JUnit测试通过 HttpClient(https协议)访问支付宝接口时不能自动获得证书的解决办法 -
snoopy7713:
[2014-03-14 17:55:06.651] TCP ...
刚完成Struts的Virgo插件,分享一下设计思路和Virgo OSGi内部的独特机制 -
snoopy7713:
需要看一下,你的代码说的挺模糊的。我的联系方式QQ 16200 ...
刚完成Struts的Virgo插件,分享一下设计思路和Virgo OSGi内部的独特机制 -
roronjavaeye:
不错,受教了
java_class反编译后的代码还原 -
daoyongyu:
讲的很好,很详细。
Struts2配置文件详解——struts.properties
http://blog.chinaunix.net/u/9295/showart_491417.html
很多 API 都需要相当数量的样板代码,比如,为了编写一个 JAX-RPC 的 WEB 服务,你需要提供一个接口和一个实现类。如果这个程序已经被加了注释 Annotations 以说明那个方法需要被远程调用,那么我们可以一个工具去自动生成这些样板代码。
还有一些 API 需要在程序代码另外维护一些文件,比如 JavaBean 需要一个 BeanInfo 类, EJB 需要一个部署描述文件。如果我们能够把这些需要另外维护的文件内容以注释 Annotation 的方式和代码放在一起维护,一定会更加方便同时也减少出错的机会。
Java 平台已经有了一些特别的注释的机制。比如 transient 修饰符就是一个特别的注释,表明这个字段应该被序列化子系统忽略; @deprecated javadoc 标签是一个特别的标签来说明某个方法已经不再被使用了。 JDK5.0 提供了一个让我们自己定义我们自己注释的功能,这个功能包含了如何定义注释类型的语法,声明注释的语法,读取注释的 API ,一个类文件保存注释(译者注:注释可以被看作一个类,我们需要用一个 .java 文件保存我们自己定义的注释源码)和一个注释处理的工具。
注释并不影响代码的语义,但却影响用于处理包含有注释的程序代码的工具的处理方式,使他们(工具)能够影响运行状态的程序的语义。注释可以从源代码中读取,从编译后的 .class 文件中读取,也可以通过反射机制在运行时读取。
注释是 JavaDoc 标签的补充。一般情况下,如果我们的主要目标是影响或者产生文档,那么我们应该使用 JavaDoc ;否则,我们应该使用注释 Annotations 。
一般的应用程序开发人员可能从不需要定义一个注释类型,但定义我们自己的注释类型并不复杂。注释类型的定义跟定义一个接口相似,我们需要在 interface 这个关键字前面加上一个 @ 符号。注释中的每一个方法定义了这个注释类型的一个元素,注释中方法的声明中一定不能包含参数,也不能抛出异常;方法的返回值被限制为简单类型、 String 、 Class 、 emnus 、注释,和这些类型的数组。方法可以有一个缺省值。这里是一个注释类型定义的例子:
/** * Describes the Request-For-Enhancement(RFE) that led * to the presence of the annotated API element. */ public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date(); default "[unimplemented]"; }
一旦定义好了一个注释类型,你就可以用来作注释声明。注释一中特殊的修饰符,在其他修饰符(比如 public , static ,或者 final 等)使用地方都可以使用。按照惯例,注释应该放在其他修饰符的前面。注释的声明用 @ 符号后面跟上这个注释类型的名字,再后面跟上括号,括号中列出这个注释中元素 / 方法的 key - value 对。值必须是常量。这里是一个例子,使用上面定义的注释类型:
@RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) public static void travelThroughTime(Date destination) { ... }
/** * Indicates that the specification of the annotated API element * is preliminary and subject to change. */ public @interface Preliminary { }
标记注释在使用的时候,其后面的括号可以省略,例如:
@Preliminary public class TimeTravel { ... }
如果注释中仅包含一个元素,这个元素的名字应该为value,例如:
/** * Associates a copyright notice with the annotated API element. */ public @interface Copyright { String value(); }
如果元素的名字为value
@Copyright("2002 Yoyodyne Propulsion Systems") public class OscillationOverthruster { ... } ,
使用这个注释的时候,元素的名字和等号可以省略,如:
为了将上面提到的东西结合在一起,我们创建了一个简单的基于注释的测试框架。首先我们需要一个标记注释类型用以说明一个方法是一个测试方法,并被测试工具执行。
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 { }
我们可以注意到这个注释类型本省也被注释了,这种注释叫做元注释。第一注释 (@Retention(RetentionPolicy.RUNTIME)) 表示这种类型的注释被 VM 保留从而使其能够通过反射在运行时读取;第二个注释 @Target(ElementType.METHOD) 表示这种注释只能用来注释方法。
下面是一个简单的类,其中的几个方法被加了上面的注释:
public class Foo { @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() { } }
这里是测试工具:
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); } }
这个工具用一个类名作为参数,遍历这个类中的所有方法,并调用其中被加了 @Test 注释的方法。如果一个方法抛出了一个异常,那么这个测试就失败了,最终的测试结果被打印了出来。下面是程序运行的结果:
$ java RunTests Foo Test public static void Foo.m3() failed: java.lang.RuntimeException: Boom Test public static void Foo.m7() failed: java.lang.RuntimeException: Crash Passed: 2, Failed 2
虽然这个测试工具只是一个玩具,但他显示了注释的强大的功能。
发表评论
-
java_class反编译后的代码还原
2012-03-18 00:06 1719java class 利用jad 反编译之后,偶尔回碰到 ... -
ThreadLocal的几种误区
2012-01-10 09:48 860最近由于需要用到ThreadLocal,在网上搜索 ... -
深入解析OGNL投影
2011-12-16 15:15 1866先看这个表达式:list.{#me=#this,#root.m ... -
浅谈JAVA ThreadPoolExecutor
2011-01-28 16:36 1308这篇文章分为两部分 ... -
ant echo message 特殊字符转换
2011-01-27 11:54 1676< < > &a ... -
hibernate------hql总结
2010-08-24 12:52 8061. 查询整个映射对象所 ... -
log4j additivity 作用
2010-08-11 22:15 1928log4j.rootLogger=debug,stdout ... -
Log4j 集群环境下的 处理方案
2010-08-11 21:17 3167需求:近期有个项目要 ... -
构建Java并发模型框架
2010-07-12 17:04 866Java的多线程特性为构建 ... -
Java 程序中的多线程
2010-07-12 17:03 799由于在语言级提供了线 ... -
JAVA 线程 基础概念
2010-07-12 17:00 1014Java 有几程方法可以实 ... -
在 Java 平台上进行多线程编程的缺陷
2010-07-12 16:58 948Java 语言的并发编程 就其自身来说,并发编程是一种 ... -
c3p0-0.9.1.2数据库连接池
2010-06-17 11:46 1356C3PO是一个开放源代码的JDBC数据源实现项目,它在li ... -
Axis2快速上手指南
2010-06-03 17:59 770http://hideto.iteye.com/blog/56 ... -
C3P0连接池详细配置与实现
2010-05-31 17:33 1023<c3p0-config> <defau ... -
实例讲解:JAVA SOAP技术
2010-05-25 18:19 2343Very Simple Object Access Proto ... -
Tomcat 5.5 JNDI Resource 配置
2010-05-25 11:14 1625本文来自CSDN博客,转载请标明出处:http://blog. ... -
SSH2 jar
2010-05-21 14:51 1662在JavaEE企业级开发中, ... -
让httpclient接受所有ssl证书https 分享
2010-04-29 11:21 5066访问https 资源时,让httpclient接受所有ssl证 ... -
使用JUnit测试通过 HttpClient(https协议)访问支付宝接口时不能自动获得证书的解决办法
2010-04-29 11:17 5223最近在做一个通过 HttpCl ...
相关推荐
我们有必要对JDK 5.0新增的注解(Annotation)技术进行简单的学习,因为Spring 支持@AspectJ,而@AspectJ本身是基于JDK 5.0的注解技术。所以学习JDK 5.0的注解知识有助于我们更好地理解和掌握Spring的AOP技术。 ...
java或Java框架中常用的注解及其作用详解:Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过...
方式二:jdk5.0之后,可以使用enum关键字定义枚举类 三、Enum类的主要方法: 四、使用enum关键字定义的枚举类实现接口的情况 栗子一:实现接口,在enum类中实现抽象方法。 栗子二:让枚举类的 对象分别实现接口中...
该插件有助于从Maven使用JDK8提供的集成在Java编译器中的新注释处理 该插件是Maven apt插件的“ alter ego” 文献资料 相关插件 插入 信息 Jboss的eclipse插件 eclipse插件 开发注释处理器 发行版 日期 版本 信息 ...
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节...
定义:注解(Annotation),也叫元数据。...它是JDK5.0及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。 内置的注解 作用在代码的注解是 @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,...
Java 注解(Annotation)是 JDK 5.0 及以后版本引入的一个特性,它是一个新的类型,与类、接口、枚举是在同一个层次。注解可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
Java 注解(Annotation)是 JDK 5.0 及以后版本引入的一个特性。它是一个新的类型,与接口类似,位于同一个层次,称为 Java 的一个类型(TYPE)。注解可以声明在包、类、字段、方法、局部变量、方法参数等的前面,...
在使用maven 打包或者编译时报:-source1.3 中不支持注释错误解决方案如下: <artifactId>maven-compiler-plugin <version>2.0.2 <source>1.5 <target>1.5 添加如下配置就不会再报错...