|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net也不过3,4本书足以,这就是区别。中文
BYme
很多API都必要必定数目的榜样编码。比方,为了写一个JAX-RPCweb服务,你必需供应一对接口和完成组合。假如一个被远程会见的程序被正文标识所粉饰,那末这个模板就能够使用工具来主动天生。
另有一些APIs必要分外文件(sidefiles)和程序一同并行来保持。比方,JavaBean必要一个BeanInfo类和该Bean一同并行保持,而企业级JavaBean(EJB)则必要一个设置形貌符。假如在分外文件中的信息以程序正文的情势保留在程序自己中,那将加倍便当而且使毛病偏向更少。
Java平台已具有了出格的正文机制。比方transient润色是一个出格的正文标识:该地区应当被一连子体系疏忽。而@deprecated标识是一种特别正文标识:办法不该该再被利用。到了5.0版本中,该平台具有一个多目标的工具就是同意你界说并利用你本人的正文范例。这类工具包含声明正文范例的语法,正文声明的语法,读取正文的APIs,暗示正文的类文件和一个正文处置工具。
正文不间接影响程序的语义,可是它们影响工具和库处置该程序的办法,如许就可以够转已往影响运转时程序的语义。正文从源文件,类文件中被读取,大概在运转时反应出来。
典范的使用程序历来不用界说一个正文范例,但如许做也不难。正文范例声明于一般的接口(interface)声明类似。在关头字interface前加个@标记。每个办法声明界说一个正文范例的元素。办法声明不用有参数或throws语句。前往值被限定为原始的String,Class,enums,annotations和以上范例array。办法能够由缺省值。这是一个正文范例声明的例子:
/**
*DescribestheRequest-For-Enhancement(RFE)thatled
*tothepresenceoftheannotatedAPIelement.
*/
public@interfaceRequestForEnhancement{
intid();
Stringsynopsis();
Stringengineer()default"[unassigned]";
Stringdate();default"[unimplemented]";
}
一旦一个正文范例被界说,你能够用它往正文声明。一个正文是一个特别品种的润色成份,可以用在别的润色成份(比方:public,static,大概final)可以利用的任何中央。依据协议,凝视应先于别的润色成份。正文由一个at标记@随着正文范例和括号括起来的元素值对列表。这些值必需是编译时的常量。这里有一个带有正文的对应上述正文范例声明的办法声明:
@RequestForEnhancement(
id=2868724,
synopsis="Enabletime-travel",
engineer="Mr.Peabody",
date="4/1/3007"
)
publicstaticvoidtravelThroughTime(Datedestination){...}
一个不带元素正文范例被界说为一个marker正文范例,比方:
/**
*IndicatesthatthespecificationoftheannotatedAPIelement
*ispreliminaryandsubjecttochange.
*/
public@interfacePreliminary{}
在marker正文中省略括号是能够的,好比:
@PreliminarypublicclassTimeTravel{...}
在正文中带有一个独自的元素,这个元素应当被定名为value,象以下:
/**
*AssociatesacopyrightnoticewiththeannotatedAPIelement.
*/
public@interfaceCopyright{
Stringvalue();
}
在一个元素名为value的单位素正文中,省略元素名和=号是同意的,比方:
@Copyright("2002YoyodynePropulsionSystems")
publicclassOscillationOverthruster{...}
为了把一切的接洽起来,我们将创建一个复杂的基于正文的测试框架。起首我们必要一个marker正文范例来指出一个办法是一个测试办法,而且应当被测试工具来实行:
importjava.lang.annotation.*;
/**
*Indicatesthattheannotatedmethodisatestmethod.
*Thisannotationshouldbeusedonlyonparameterlessstaticmethods.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public@interfaceTest{}
注重这个正文范例声明是自正文的。如许的正文被叫做meta-annotations。第一个(@Retention(RetentionPolicy.RUNTIME))指出带有这类范例的正文被假造机保存,因而它们可以在运转时反应出来。第二个(@Target(ElementType.METHOD)指出这个正文范例只可以正文办法声明。
这有一个示例程序,其办法中的一些由上述接口来正文:
publicclassFoo{
@Testpublicstaticvoidm1(){}
publicstaticvoidm2(){}
@Testpublicstaticvoidm3(){
thrownewRuntimeException("Boom");
}
publicstaticvoidm4(){}
@Testpublicstaticvoidm5(){}
publicstaticvoidm6(){}
@Testpublicstaticvoidm7(){
thrownewRuntimeException("Crash");
}
publicstaticvoidm8(){}
}
这是测试工具:
importjava.lang.reflect.*;
publicclassRunTests{
publicstaticvoidmain(String[]args)throwsException{
intpassed=0,failed=0;
for(Methodm:Class.forName(args[0]).getMethods()){
if(m.isAnnotationPresent(Test.class)){
try{
m.invoke(null);
passed++;
}catch(Throwableex){
System.out.printf("Test%sfailed:%s%n",m,ex.getCause());
failed++;
}
}
}
System.out.printf("Passed:%d,Failed%d%n",passed,failed);
}
}
这个工具用一个类名作为命令行参数而且反复一切的定名类中试图挪用每个用Test正文范例(下面界说的)正文的办法的办法。这个映照行列来找出是不是一个办法有一个被用绿色夸大的Test正文。假如测试办法启动抛出一个非常,测试则被以为已失利。而且一个失利呈报被打印出来。最初。一个择要被打印出来显现经由过程和失利的测试的数目。这是在Foo程序上运转这个测试工具的情形:
$javaRunTestsFoo
TestpublicstaticvoidFoo.m3()failed:java.lang.RuntimeException:Boom
TestpublicstaticvoidFoo.m7()failed:java.lang.RuntimeException:Crash
Passed:2,Failed2
这个小的测试工具树模了正文的功能,也能够被轻松扩大来克制它的限定。
到时我们不用学struts,不用学spring,不用学Hibernate,只要能把jsf学会了,完全可以替代所有的框架,包括AJAX,都知道AJAX并不是新技术,虽说我没深入学习jsf但我认为jsf应该已经能通过其它技术替代AJAX,实现无缝刷新。 |
|