分享
 
 
 

Annotations中文翻译

王朝java/jsp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

BY me

许多API都需要一定数量的样板编码。例如,为了写一个JAX-RPC web服务,你必须提供一对接口和实现组合。如果一个被远程访问的程序被注释标识所装饰,那么这个模板就可以利用工具来自动生成。

还有一些APIs需要额外文件(side files)和程序一起并行来维持。例如,JavaBean需要一个BeanInfo类和该Bean一起并行维持,而企业级JavaBean(EJB)则需要一个配置描述符。如果在额外文件中的信息以程序注释的形式保存在程序本身中,那将更加便利并且使错误倾向更少。

Java平台已经拥有了特别的注释机制。例如transient修饰是一个特别的注释标识:该区域应该被连续子系统忽略。而@deprecated标识是一种特殊注释标识:方法不应该再被使用。到了5.0版本中,该平台拥有一个多目的的工具就是允许你定义并使用你自己的注释类型。这种工具包括声明注释类型的语法,注释声明的语法,读取注释的APIs,表示注释的类文件和一个注释处理工具。

注释不直接影响程序的语义,但是它们影响工具和库处理该程序的方法,这样就能够转过去影响运行时程序的语义。注释从源文件,类文件中被读取,或者在运行时反映出来。

典型的应用程序从来不必定义一个注释类型,但这样做也不难。注释类型声明于正常的接口(interface)声明相似。在关键字interface前加个@符号。每一个方法声明定义一个注释类型的元素。方法声明不必有参数或throws语句。返回值被限制为原始的String,Class,enums,annotations和以上类型array。方法可以由缺省值。这是一个注释类型声明的例子:

/**

* 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)能够使用的任何地方。根据协定,注视应先于其它修饰成分。注释由一个at符号@跟着注释类型和括号括起来的元素值对列表。这些值必须是编译时的常量。这里有一个带有注释的对应上述注释类型声明的方法声明:

@RequestForEnhancement(

id = 2868724,

synopsis = "Enable time-travel",

engineer = "Mr. Peabody",

date = "4/1/3007"

)

public static void travelThroughTime(Date destination) { ... }

一个不带元素注释类型被定义为一个marker注释类型,例如:

/**

* Indicates that the specification of the annotated API element

* is preliminary and subject to change.

*/

public @interface Preliminary { }

在marker注释中省略括号是可以的,比如:

@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 { ... }

为了把所有的联系起来,我们将建立一个简单的 基于注释的测试框架。首先我们需要一个marker注释类型来指出一个方法是一个测试方法,并且应该被测试工具来执行:

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 { }

注意这个注释类型声明是自注释的。这样的注释被叫做meta-annotations。第一个(@Retention(RetentionPolicy.RUNTIME))指出带有这种类型的注释被虚拟机保留,因此它们能够在运行时反映出来。第二个(@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注释类型(上面定义的)注释的方法的方法。这个映射队列来找出是否一个方法有一个被用绿色强调的Test注释。如果测试方法启动抛出一个异常,测试则被认为已经失败。并且一个失败报告被打印出来。最后。一个摘要被打印出来显示通过和失败的测试的数量。这是在Foo程序上运行这个测试工具的情况:

$ 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

这个小的测试工具示范了注释的功效,也可以被轻松扩展来克服它的限制。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有