王朝网络
分享
 
 
 

在Eclipse 3.1体验J2SE 5.0新特性四(图)

王朝java/jsp·作者佚名  2008-05-31
宽屏版  字体: |||超大  

3.Documented:这个注释(Annotation)将作为public API的一部分。

4.Inherited : 假设注释(Annotation)定义的时候使用了Inherited,那么假如这个注释(Annotation)修饰某个class,这个类的子类也被这个注释(Annotation)所修饰。

2.3注释的应用

下面各小节显示了在哪些情况下可以使用注释以及如何使用注释。

2.3.1动态查找注释

当我们定义好了注释以后,我们可以开发一些分析工具来解释这些注释。这里通常要用到java的反射特性。比如说我们希望找到某个对象/方法/域使用了哪些注释,或者获得某个特定的注释,或者判定是否使用某个特定的注释, 我们可以参考下面这个例子。

这个例子中定义了两个注释:TODO和TOFORMATE。在MyCalculator类中,TODO用来修饰方法calculateRate,而TOFORMATE用来修饰类变量concurrency和debitDate。而在类TestCalculator的main函数中,通过Java反射特性,我们查找到使用这些注释的类变量和方法。清单12-清单15分别显示这些类的定义。

清单12 TODO注释的定义

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public @interface TODO {

int PRiority() default 0;

}

清单13 TOFORMATE的定义

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

public @interface TOFORMATE {

}

清单14 使用注释的类MyCalculator

public class MyCalculator {

boolean isReady;

@TOFORMATE double concurrency;

@TOFORMATE Date debitDate;

public MyCalculator() {

super();

}

@TODO

public void calculateRate(){

System.out.println("Calculating...");

}

}

清单15动态查找注释

public class TestCalculator {

public static void main(String[] args) {

MyCalculator cal = new MyCalculator();

cal.calculateRate();

try {

Class c = cal.getClass();

Method[] methods = c.getDeclaredMethods();

for (Method m: methods) {

// 判定这个方法有没有使用TODO

if (m.isAnnotationPresent(TODO.class))

System.out.println("Method "+m.getName()+": the TODO is present");

}

Field[] fields = c.getDeclaredFields();

for (Field f : fields) {

// 判定这个域有没有使用TOFORMATE

if (f.isAnnotationPresent(TOFORMATE.class))

System.out.println

("Field "+f.getName()+": the TOFORMATE is present");

}

} catch (Exception exc) {

exc.printStackTrace();

}

}

}

下面我们来运行这个例子,这个例子的运行结果如图10所示。

运行结果和我们先前的定义是一致的。在运行时,我们可以获得注释使用的相关信息。

图6 运行结果

在我们介绍了什么是注释以后,你可能会想知道注释可以应用到什么地方呢?使用注释有什么好处呢?在下面的小节中我们将介绍一个稍复杂的例子。从这个例子中,你将体会到注释所以提供的强大的描述机制(declarative programming)。

2.3.2 使用注释替代Visitor模式

在J2SE 5.0以前,我们在设计应用的时候,我们经常会使用Visitor这个设计模式。Visitor这个模式一般是用于为我们已经设计好了一组类添加方法,而不需要担心改变定义好的类。比如说我们已经定义了好了一组类结构,但是我们希望将这些类的对象部分数据输出到某种格式的文件中。

Vistor模式的实现

使用Vistor模式,首先我们在Employee这个类中加入eXPort方法,export方法如图7所示。Export方法接受Exporter对象作为参数,并在方法体中调用exporter对象的visit()方法。

图7 使用Vistor模式实现格式输出

在这里我们定义了一个Exporter抽象类,我们可以通过继续Exporter类,重写其visit方法来实现不同格式的文件输出。

图7种给出visit方法的实现是一个简单的例子。假如要实现输出成xml格式的,可以定义Exporter子类:XMLExporter。假如希望输出成文本的可以定义TXTExporter。但是这样做不够灵活的地方在于,假如Employee加入其他的域变量,那么相应的visitor类也需要进行修改。这就违反了面向对象Open for Extension, close for Modification的原则。

使用注释替代Vistor模式

使用注释(Annotation),也可以完成数据输出的功能。首先定义一个新的注释类型:@Exportable。然后定义一个抽象的解释器ExportableGenerator,将Employee 对象传入解释器。

在解释器中,查找哪些域使用了Exportable这个注释(Annotation),将这些域(Field)按照一定格式输出。图12给出了Exportable注释的定义。

清单16注释Exportable的定义

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

@Inherited

public @interface Exportable {

}

清单17-清单20中给出了包含数据的这些类的定义以及这些类是如何使用注释Exportable的。 图18定义了Main函数,使用ExporterGenerator来产生输出文件。清单21给出了使用注释来实现这一功能的两个类:ExporterGenerator和TXTExporterGenerator。

其中ExporterGenerator定义了一个基本的框架。而TXTExporterGenerator继续了ExporterGenerator,并且重写了outputField方法,在这个方法中实现了特定格式的输出。用户可以继续这个ExporterGenerator,并且实现其中的抽象方法来定义自己期望的格式。

清单17 Employee的类定义

public abstract class Employee {

public abstract String getName();

public abstract String getEmpNo();

public Employee() {

super();

}

}

清单18 Regular的类定义

public class Regular extends Employee{

@Exportable String name;

@Exportable String address;

@Exportable String title;

@Exportable String phone;

@Exportable String location;

@Exportable Date onboardDate;

@Exportable ArrayList team;

String empNo;

public Regular(String name, String address, String title, String phone,

String location, Date date) {

super();

this.name = name;

this.address = address;

this.title = title;

this.phone = phone;

this.location = location;

onboardDate = date;

team = new ArrayList();

}

public void addMemeber(Employee e){

team.add(e);

}

@Override

public String getName() {

// TODO Auto-generated method stub

return name;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝网络 版权所有