|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。
良多API都必要相称数目的榜样代码,好比,为了编写一个JAX-RPC的WEB服务,你必要供应一个接口和一个完成类。假如这个程序已被加了正文Annotations以申明谁人办法必要被远程挪用,那末我们能够一个工具往主动天生这些榜样代码。
另有一些API必要在程序代码别的保护一些文件,好比JavaBean必要一个BeanInfo类,EJB必要一个部署形貌文件。假如我们可以把这些必要别的保护的文件内容以正文Annotation的体例和代码放在一同保护,必定会加倍便利同时也削减堕落的时机。
Java平台已有了一些出格的正文的机制。好比transient润色符就是一个出格的正文,标明这个字段应当被序列化子体系疏忽;@deprecatedjavadoc标签是一个出格的标签来讲明某个办法已不再被利用了。JDK5.0供应了一个让我们本人界说我们本人正文的功效,这个功效包括了怎样界说正文范例的语法,声明正文的语法,读取正文的API,一个类文件保留正文(译者注:正文能够被看做一个类,我们必要用一个.java文件保留我们本人界说的正文源码)和一个正文处置的工具。
正文其实不影响代码的语义,但却影响用于处置包括有正文的程序代码的工具的处置体例,使他们(工具)可以影响运转形态的程序的语义。正文能够从源代码中读取,从编译后的.class文件中读取,也能够经由过程反射机制在运转时读取。
正文是JavaDoc标签的增补。一样平常情形下,假如我们的次要方针是影响大概发生文档,那末我们应当利用JavaDoc;不然,我们应当利用正文Annotations。
一样平常的使用程序开辟职员大概从不必要界说一个正文范例,但界说我们本人的正文范例其实不庞大。正文范例的界说跟界说一个接口类似,我们必要在interface这个关头字后面加上一个@标记。正文中的每个办法界说了这个正文范例的一个元素,正文中办法的声明中必定不克不及包括参数,也不克不及抛出非常;办法的前往值被限定为复杂范例、String、Class、emnus、正文,和这些范例的数组。办法能够有一个缺省值。这里是一个正文范例界说的例子:
/***DescribestheRequest-For-Enhancement(RFE)thatled*tothepresenceoftheannotatedAPIelement.*/public@interfaceRequestForEnhancement{intid();Stringsynopsis();Stringengineer()default"[unassigned]";Stringdate();default"[unimplemented]";}
一旦界说好了一个正文范例,你就能够用来作正文声明。正文一中特别的润色符,在其他润色符(好比public,static,大概final等)利用中央都可使用。依照常规,正文应当放在其他润色符的后面。正文的声明用@标记前面跟上这个正文范例的名字,再前面跟上括号,括号中列出这个正文中元素/办法的key-value对。值必需是常量。这里是一个例子,利用下面界说的正文范例:
@RequestForEnhancement(
id=2868724,
synopsis="Enabletime-travel",
engineer="Mr.Peabody",
date="4/1/3007"
)
publicstaticvoidtravelThroughTime(Datedestination){...}
没有元素/办法的正文被成为标志(marker)正文范例,比方
/**
*IndicatesthatthespecificationoftheannotatedAPIelement
*ispreliminaryandsubjecttochange.
*/
public@interfacePreliminary{}
标志正文在利用的时分,厥后面的括号能够省略,比方:
@PreliminarypublicclassTimeTravel{...}
假如正文中仅包括一个元素,这个元素的名字应当为value,比方:
/**
*AssociatesacopyrightnoticewiththeannotatedAPIelement.
*/
public@interfaceCopyright{Stringvalue();}
假如元素的名字为value,利用这个正文的时分,元素的名字和等号能够省略,如:
@Copyright("2002YoyodynePropulsionSystems")
publicclassOscillationOverthruster{...}
为了将下面提到的工具分离在一同,我们创立了一个复杂的基于正文的测试框架。起首我们必要一个标志正文范例用以申明一个办法是一个测试办法,并被测试工具实行。
importjava.lang.annotation.*;
/**
*Indicatesthattheannotatedmethodisatestmethod.
*Thisannotationshouldbeusedonlyonparameterlessstaticmethods.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public@interfaceTest{}
我们能够注重到这个正文范例本省也被正文了,这类正文叫做元正文。第一正文(@Retention(RetentionPolicy.RUNTIME))暗示这类范例的正文被VM保存从而使其可以经由过程反射在运转时读取;第二个正文@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正文的办法。假如一个办法抛出了一个非常,那末这个测试就失利了,终极的测试了局被打印了出来。上面是程序运转的了局:
$javaRunTestsFoo
TestpublicstaticvoidFoo.m3()failed:java.lang.RuntimeException:Boom
TestpublicstaticvoidFoo.m7()failed:java.lang.RuntimeException:Crash
Passed:2,Failed2
固然这个测试工具只是一个玩具,但他显现了正文的壮大的功效。
Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。Oracle收购Sun后Java前途未卜。 |
|