Java注解指导手册–终极向导-Java开发Java经验技巧_第1页
Java注解指导手册–终极向导-Java开发Java经验技巧_第2页
Java注解指导手册–终极向导-Java开发Java经验技巧_第3页
Java注解指导手册–终极向导-Java开发Java经验技巧_第4页
Java注解指导手册–终极向导-Java开发Java经验技巧_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、java注解指导手册-终极向导-编程开发技术java注解指导手册-终极向导译文出处:toien liu原文出处:dani buiza编者的话:注解是java的一个主要特性且每个java开发者都应该知道如何使用 它。我们已经在java?code?geeks提供了丰富的教程,?如creating your own java annotations, ?java annotations tutorial with custom annotation?和?java?annotat ions:?explored?&?explained.我们也有些文章是关于注解在不同类库中的应用,包括?makc?

2、your?spring?sccurity?sccurcd?annotations?morc?dry和?java?annotations?&?a?real?world?spring?example现在,是时候汇总这些和注解相关的信息到一篇文章了,祝大家阅读愉快。h录1. 什么是注解2. 介绍3. 消费器4. 注解语法和注解元索5. 在什么地方使用6. 使用案例7. 内建注解& java 8与注解9. 自定义注解10. 提取注解11. 注解集成12. 使用注解的知名类库13. 小结14. 下载15. 资料在这篇文章中我们将阐述什么是j3v3注解,它们如何工作,怎么使用它们。我们将揭

3、开java注解的面纱,包括内建注解或称元注解,还将讨论java8屮与 z相关的的新特性。最后,我们将实现自定义的注解,编写一个使用注解的处理程序(消费器),它 通过java反射使用注解。我们还会列岀一些基于注解,知名h被广泛应用的第三方类库如:jimit, jaxb, spring,ilibernate。在文章的最后,会有一个压缩文件包含了文章中的所有示例,实现这些例了使用 的软件版本如下所示: eclipse luna 4.4 jre update 8.20 junit 4 hibernate 4.3.6 findbugs 3.0.01什么是注解?注解早在j2se1.5就被引入到java屮,

4、主要提供一种机制,这种机制允许程序 员在编写代码的同时可以直接编写元数据。在引入注解z前,程序员们描述其代码的形式尚未标准化,每个人的做法各异: transient关键字、注释、接口等。这显然不是一种优雅的方式,随之/而来的一 种崭新的记录元数据的形式注解被引入到java中。其它因索也促成了这个决定:当吋不同类型的应用程序使用xml作为标准的代码 配置机制,这其实并不是最佳方式,因为代码和xml的解耦以及未來对这种解耦 应用的维护并不低廉。另外,由于非保留字的使用,例如“©deprecated”自从 javal. 4便开始在java文档中使用。我非常确定这是一个现在在注解中使用 原因

5、。包含注解的设计和开发的java规范主要有以下两篇: jsr 175 a metadata facility for the java programming language jsr 250 common annotations for the java platform2.介绍解释何为注解的最佳方式就是元数据这个词:描述数据自身的数据。注解就是代 码的元数据,他们包含了代码自身的信息。注解可以被用在包,类,方法,变量,参数上。fl java8起,有一种注解几乎可 以被放在代码的任何位置,叫做类型注解。我们将会在后而谈到具体用法。被注解的代码并不会直接被注解影响。这只会向第三系统捉供关于自己

6、的信息以 用于不同的需求。注解会被编译至class文件中,而且会在运行时被处理程序提取出来用于业务逻 辑。当然,创建在运行时不可用的注解也是可能的,甚至可以创建只在源文件中 可用,在编译时不可用的注解。3 消费器理解注解的目的以及如何使用它都会帯来困难,因为注解本身并不包含任何功能 逻辑,它们也不会影响自己注解的代码,那么,它们到底为什么而存在呢?这个问题的解释就是我所称的注解消费器。它们是利用被注解代码并根据注解信 息产生不同行为的系统或者应用程序。例如,在java t带的内建注解(元注解)屮,消费器是执行被注解代码的jvm。 还有其他稍后谈到的其他例子,例如junit,消费器是读取,分析被

7、注解代码的 junit处理程序,它还可以决定测试单元和方法执行顺序。我们会在junit章节 更深入。消费器使用java中的反射机制來读取和分析被注解的源代码。使用的主要的包 冇:java, lang, java. lang, reflecto我们将会在本篇指南屮介绍如何用反射从 头开始创建一个自定义的消费器。4. 注解语法和元素声明一个注解需要使用“幘 作为前缀,这便向编译器说明,该元素为注解。例 如:©annotationpublic void annotatedmehod() 上述的注解名称为annotation,它止在注解annotatedmethod方法。编译器会 处理它。注

8、解可以以键值对的形式持有有很多元素,即注解的属性。annotation (info 二 t am an annotation",counter 二 55)public void annotatedmehod() 如果注解只包含一个元素(或者只需要指定一个元素的值,其它则使用默认值), 可以像这样声明:©annotationam an annotation,z) public void emnotatcdmchod() 就像我们看到的一样,如果没有元素需要被指定,则不需要括号。多个注解可以 使用在同一代码上,例如类: annotation (info = ,zu a u 0)

9、 annotation2class annotatedclass 一些jewel本身提供的开箱即用的注解,我们称之为内建注解。也口j以定义你自 己的注解,称之为子定义注解。我们会在下一章讨论。5. 在什么地方使用注解基本上可以在java程序的每一个元索上使用:类,域,方法,包,变量, 等等。自java8,诞生了通过类型注解的理念。在此之前,注解是限于在前面讨论的元 索的声明上使用。从此,无论是类型还是声明都口j以使用注解,就像:myarmoteition string str 二 /zdanibuizei”;我们将会在java8关联章节看到这种机制的更多细节。6. 使用案例注解可以满足许多要求

10、,最普遍的是:向编译器提供信息:注解可以被编译器用來根据不同的规则产住警告,其至错误。 一个例子是java8中functionalinterface注解,这个注解使得编译器校验被注解的 类,检查它是否是一个正确的函数式接口。文档:注解可以被软件应用程序计算代码的质量例如:findbugs, pmd或者口动生 成报告,例如:用来 jenkins, jira, tcamcity。 代码牛成:注解可以使用代码屮展现的元数据信息來自动生成代码或者xml文件, 一个不错的例子是jaxbo运行时处理:在运行时检查的注解可以用做不同的目的,像单元测试(junit),依 赖注入(spring),校验,日志(l

11、og4j),数据访问(hibernate)等等。在这篇手册中我们将展现儿种注解可能的用法,包扌舌流行的java类库是如何使 用它们的。7. 内建注解java语言自带了一系列的注解。在本章中我们将阐述最重要的一部分。这个清 单只涉及了 java语言最核心的包,未包含标准jre中所有包和库如jaxb或 servlet 规范。以下讨论到的注解中有一些被称之为meta注解,它们的目的注解其他注解,并 且包含关于其它注解的信息。 ©retention:这个注解注在其他注解上,并用來说明如何存储己被标记的注解。这 是一种元注解,用來标记注解并提供注解的信息。可能的值是:o source:表明这个

12、注解会被编译器忽略,并只会保昭在源代码中。o class:表明这个注解会通过编译驻超在class文件,但会被jvm在运行 时忽略,正因为如此,其在运行时不可见。o runtime:表示这个注解会被jvm获取,并在运行时通过反射获取。我们会在稍后展开儿个例子。 target:这个注解用于限制某个元素町以被注解的类型。例如:o annotation_type表示该注解可以应用到其他注解上o constructor表示可以使用到构造器上o field表示可以使用到域或属性上o local_var1able表示可以使用到局部变量上。o method nj以使用到方法级别的注解上。o package可以

13、使用到包声明上。o parameter可以使用到方法的参数上o type可以使用到一个类的任何元素上° documented:被注解的元素将会作为javadoc产生的文档中的内容。注解都默认 不会成为成为文档屮的内容。这个注解可以对其它注解使用。 ©inherited:在默认情况下,注解不会被子类继承。被此注解标记的注解会被所有子 类继承。这个注解可以对类使用。 deprecated:说明被标记的元素不应该再度使用。这个注解会让编译器产生警告消 息。可以使用到方法,类和域上。相应的解释和原因,包括另一个可取代的方法应 该同时和这个注解使用。 suppresswamings:

14、说明编译器不会针对指定的一个或多个原因产生警告。例如: 如果我们不想因为存在尚未使用的私有方法而得到警告可以这样做: suppresswarnings( "unused") private string mynotusedmethod()通常,编译器会因为没调用该方而产生警告;?用了注解抑制了这种行为。该注解 需耍一个或多个参数来指定抑制的警告类型。 override:向编译器说明被注解元素是重写的父类的一个元素。在重写父类元素的 时候此注解并非强制性的,不过可以在重写错谋时帮助编译器产生错误以提醒我们。 比如子类方法的参数和父类不匹配,或返冋值类型不同。 safevara

15、rgs:断言方法或者构造器的代码不会对参数进彳亍不安全的操作。在java 的后续版本屮,使用这个注解时将会令编译器产生一个错谋在编译期间防止潜在的 不安全操作。更多信息请参考:http:/docs. oracle com/javase/7/docs/api/java/lang/safevarargs html8. java 8与注解j3va8带來了一些优势,同样注解框架的能力也得到了提升。在本章我们将会阐 述,并就九、。8带来的3个注解做专题说明和举例:©repeatable注解,关于类型注解的声明,函数式接口注解©functionalinterface (与 lambda

16、s 结合使用)。 repeatable:说明该注解标识的注解对以多次使用到同一个元素的声叽上。看一个使用的例子。首先我们创造一个能容纳重复的注解的容器:/* container for the link canberepeated annotation containing a list of values*/©retention( retentionpolicy.runtime )target ( elementtype. type_use )public interface repeatedvaluescanberepeated value ();接着,创建注解本身,然后标记&#

17、169;repeatable©retention( retentionpolicy.runtime )©target ( elementtype. type use )repeatable ( repeatedvalues. class )public ©interface canberepeatedstring value ();最后,我们可以这样重复地使用:canberepeated( the color is green") ©canberepeated( the color is red") ©canberepeat

18、ed( the color is blue") publ ic class repeatableannotated如果我们尝试去掉repeatable©retention( retentionpolicy. runtime ) target ( elementtype. type use ) public ©interface cannotberepeatedstring value ();cannotberepeated( "info")/*duplicate* if we try repeat the annotation we wil1

19、get an error: armotation of non-repeatable type* ©cannotberepeated. only annotation types marked* repeatable can be used multiple times at one target. */ cannotberepeated( "more info") public class repeatableannotatedwrong i我们会得到编译器的错误信息:duplicate annotation of non-repeatable type自jav

20、a8 jt-始,我们可以在类型上使用注解。由于我们在任何地方都可以使用类型, 包括new操作符,casting, implements, throw等等。注解可以改善对java代码的 分析并且保证更加健壮的类型检查。这个例子说明了这一点: suppresswarnings( used") public static void main( string args ) / type def ©typeannotated string cannotbeempty 二null; / type list<typeannotated string>mylist = new

21、arrayliststring> (); / values st ring mys tring = new typea rm otated string( his is arm oteited in java 8); / in method params public void methodannotated( typeannotated int parameter ) system .out. println( do nothing");所有的这些在java8之前都是不可能的。 functionalinterface:这个注解表示一个函数式接口元素。函数式接口是一种只有 一个

22、抽象方法(非默认)的接口。编译器会检查被注解元素,如果不符,就会产生 错误。例子如下: / implementing its methods suppresswarnings( "unused") mycustomtnterface myfunctnterface 二 new mycustomtnterface() ©override publicintdosomething( int param ) returnparam*10; ; / using lambdas suppresswarnings( "unuscct ) mycustominterf

23、ace mfunclnterfacelambdas = ( x ) -> ( x * 10 ); ©functionalinterface interface mycustomlnterface /* * more abstract methods will cause the interface not to be a valid functional interface and * the compiler will thrown an error:invalid'functionalinterface, annotation; * functionailntcrf

24、aceannotation. mycustomlntcrface is not a functional interface */ / boolean isfunctionallnterface(); int dosomcthing( int param );这个注解可以被使用到类,接口,枚举和注解木身。它的被jvm保留并在runtime 可见,这个是它的声明:©documented©retention (value二runtime)target(value二type)public ©interface functionalinterface9. 自定义注解正如我

25、们z前多次提及的,可以定义和实现自定义注解。本章我们即将探讨。 首先,定义一个注解:public ©interface custoinannotationclass这样创建了一个新的注解类型名为customannotationclasso关键字: ©interface说明这是一个自定义注解的定义。z后,你需要为此注解定义一对强制性的属性,保留策略和口标。述有一些其他 属性可以定义,不过这两个是最基本和重要的。它们在第8章,描述注解的注解 时讨论过,它们同样也是java内建的注解。所以,我们为自定义的注解设置属性:©retention( retentionpolic

26、y. runtime ) targct ( elcmcnttypc. type )public ©interface customannotationclass implements custoinannotationmethod在保留策略中runtime告诉编译器这个注解应该被被jvm保留,并冃能通过反 射在运行时分析。通过type我们又设置该注解可以被使用到任何类的元素上。z后,我们定义两个注解的成员:©retention( retentionpolicy.runtime )©target ( elementtype. type )public interfa

27、ce customarmotationclasspublic string author() default z,danibuiza"public string date();以上我们仅定义了默认值为“chnibuizq”的author属性和没有默认值的 date属性。我们应强调所有的方法声明都不能有参数和throw 了句。这个返回 值的类型被限制为之前提过的字符串,类,枚举,注解和存储这些类型的数组。现在我们口j以像这样使用刚创建的自定义注解:©customannotationclass( date = "2014-05-05")public clas

28、s annotatedclass在另一种类似的用法中我们可以创建一种注解方法的注解,使用target method: ©retention( retentionpolicy. runtime )©target( elementtype. method )public ©interface custoinannotationmethodpublic string author() default z,danibuizet;public string date();public string description();这种注解可以使用在方法声明上:©cus

29、tomannotationmethod( date 二 2014-06-05", description 二 annotated method'7 )public string armotatedmethod()return "nothing niente,z;customa nn otati on method ( author = "friend of mine", date = 2014-06-05", description = "'annotated method")public string an

30、notatedmethodfromafriend()return "nothing niente;冇很多其它屈性可以用在自定义注解上,但是目标(target)和保留策略 (retention policy)是最重要的两个。10. 获取注解java反射apt包含了许多方法来在运行时从类,方法或者其它元索获取注解。 接口 annotatedelement包含了大部分重要的方法,如下: getannotations():返回该元素的所有注解,包括没有显式定义该元素上的注解。 isannotationpresent伽notation):检查传入的注解是否存在于当前元素。 getannotat

31、ion(class):按照传入的参数获取指定类型的注解。返冋null说明当前元素 不带有此注解。class 通过 java. lang. class 被实现,java. lang, reflect. method 和 java. lang, reflect. field,所以可以基木上被和任何jqvei元素使用。现在,我们将看一个怎么读取注解的例子:我们写一个程序,从一个类和它的方法中读取所有的存在的注解:public static void main( string args ) throws exceptionclass<annotatedclass> object = ann

32、otatedclass.class;/ retrieve all annotations from the classarmotation armotations 二 object.getarmotations ();for( annotation annotation : annotations )systemout. printin( annotation );/ checks if an annotation is presentif ( object. isannotationpresent( customannotationclass, class )/ gets the desir

33、ed annotationannotation annotation 二object. getannotation( customannotationclass, class );system, out. println( annotation );/ the same for al 1 methods of the classfor( method method : object.gctdcclarcdmcthods()if( method. isannotationpresent( customannotationmethod. class )annotation annotation =

34、method. getannotation( custoinannotationmethod. class );system. out. println( annotation );输出如下:com. danibuiza. javacodcgccks. customemnotations. customannotationclass ( getlnfo=lnfo, author=danibuiza, date二2014-05-05)©com. danibuiza. javacodegeeks, customannotations. customannotationclass( get

35、tnfo=tnfo, author=danibuiza, date=2014-05-05)com. danibuiza. javacodegeeks, customannotations. customannotationmethod (author=friend of mine, date二2014-06-05, description=annotated method) ©com. danibuiza. javacodegeeks, customannotations. customannotationmethod (author=danibuiza, date=2014-06*

36、05, description=annotated method) 在这个程序屮,我们可以看到getannotationso方法来获取所冇某个对象(方 法,类)上的所有注解的用法。展示了怎样使用isannotationpresent ()方法和 getannotation()方法检查是否存在特定的注解,和如何获取它。11注解中的继承注解在j3v3中可以使用继承。这种继承和普通的面向对象继承几乎没有共同点。如果一个注解在java屮被标识成继承,使用了保留注解©inherited,说明它注 解的这个类将自动地把这个注解传递到所有子类中而不用在子类中声明。通常, 一个类继承了父类,并不继承

37、父类的注解。这完全和使用注解的口的一致的:提 供关于被注解的代码的信息而不修改它们的行为。我们通过一个例子更清楚地说明。首先,我们定义一个自动继承的自定义注解。©inherited©retention(retentionpolicy. runtime)target (elementtype. type)public interface tnheritedannotation有一个父类名为:annotatedsuperclass,已经被自定义的注解给注解上了:inheritedannotationpublic class annotatcdsupcrclasspublic v

38、oid onemethod()i!一个了类继承父类:inheriteda rm otationpublic class annotatedsuperclasspublic void onemethod()子类annotatcdsubclass展示了自动继承的注解inheritcdannotationo我们 看到下面的代码通过isannotationpresent()方法测试岀了当前注解。<pre>system. out. println( is true: " +annotatedsuperclass. class. isannotationpresent( inheri

39、tedannotation. cl ass );system, out println( "is true: " +annotatedsubclass. class. isannotationpresent( inheritedannotation. clas s ) );</pre><pre>输出如下:is true: trueis true: true我们可以看到子类虽然并没有声明注解,但还是被自动地注解上了。如果我们尝试注解在一个接口屮:inheriteda rm otat ionpublic interface annotatcdlnterf

40、acepublic void onemethod();i一个实现了该接口的类:public class annotatedlmplementedclass implements annotatedinterface ©overridepublic void onemethod()经过 isannotat ionpresent ()方法测试:system, out. println( is true: " +annotatedtnterface. class, isannotationpresent( tnheri tedannotation. cla ss );system

41、, out. println( is true: " +annotatedimplementedclass. class. isannotationpresent( inheritedannotat ion.class );结果如下:is true: trueis true: false这个结果说明继承注解和接口在一起使用吋,接口屮的注解在实现类屮:仅仅被 忽略。实现类并不继承接口的注解;接口继承仅仅适用于类继承。正如annotatedsubclass。inheriatcd注解仅在存在继承关系的类上产生效果,在接i和实现类上并不工 作。这条同样也适用在方法,变量,包等等。只冇类才和这

42、个注解连用。一条关于inheriated注解的很好的解释在javadoc中:http:/docs. oracle, com/javase/7/docs/api/java/lang/annotation/inherit ed. html.注解不能继承注解,如果你尝试这么做了,就会得到编译器抛出的错谋:annotation type declaration cannot have explicit superinterfaces12.使用注解的知名类库在这一章我们将展示知名类库是如何利用注解的。一些类库如:jaxb, spring framework, finclbugs, log4j, hibe

43、rnate, junito 它们使用注解来完成代码质 量分析,单元测试,xml解析,依赖注入和许多其它的工作。在这篇手册中我们将讨论以下类库的部分内容:12. 1. junit这个框架用于完成java中的单元测试。自junit4开始,注解被广泛应用,成为 jimit的设计的主干之一。基本上,junit处理程序通过反射读取类和测试套件,按照在方法上,类上的注 解顺序地执行它们。当然还有一些用来修改测试执行的注解。其它注解都用来执 行测试,阻止执行,改变执行顺序等等。用到的注解相当多,但是我们将会看到最重要的几个: test:这个注解向junit说明这个被注解的方法一定是一个可执行的测试方法。这

44、个注解只能标识在方法上,并且被jvm保留至运行时。 test public void testme()/test assertions asscrtequals(1, 1);从这个例子可以看到我们如何在junit中使用这类注解。before:这个注解用來向junit说明被标记的方法应该在所有测试方法之前被执行。 这对于在测试之询设置测试环境和初始化非常有用。同样只适用于方法上:bcforcpublic void setup() / initializingvariables count 二 0; init (); after:这个注解川來向junit说明被注解的方法应该在所冇单元测试z后执行。

45、 这个注解通常用来悄毁资源,关闭,禅放资源或者清理,重置等工作。 after public void clcstroy() / closing input stream stream, close (); ignore:这个方法用来向junit说明被注解的方法应该不被当作测试单元执行。即 使它被注解成为一个测试方法,也只能被忽略。 ignore test public void donottestme()count = -22;system, out. printin( "donottestme (): " + count );这个方法可能在在开发调试阶段使用,但一旦开始进

46、入发布阶段变需要将被忽略的 代码去掉。 fixmethodorder:指定执行的顺序,正常情况limit处理程序负责它按照完全随 机的无法预知的顺序执行。当所有的测试方法都相互独立的时候,不推荐使用这个 注解。但是,当测试的场景需要测试方法按照一定规则的时候,这个注解就派上用 场了。<span style二color: #888888;还有一些测试套件和类库使用了注解,例如 mockito和jmock,使用注解來创建测试对象和预期值。杳看jl'nit中所有注解 请参考:<span style二color: #888888;z,xahref=,https:/github co

47、m/junit-team/junit/wiki/getting-started>https :/github com/junit-tcam/junit/wiki/gctting-startcd</a></span></span>12. 2. hibernate ormhibernate可能是一个用得最广泛的对彖关系映射类库。它提供了对彖模型和关 系型数据库的映射框架。使用注解作为设计的一部分。在本章我们将讨论一两个由hibernate提供的注解并解释它的处理程序如何处 理它们。下而的代码段使用了©entity和©table。这两个是

48、用来向消费器(hibernate处 理程序)说明被注解的类是一个实体类,以及它映射的sql表名。实际上,这个 注解仅仅是指明了主表,还可以有说明字表的注解。©entitytablc( namc = "hibcrn3tc_3rmotatcd")public class hibernateannotated接下來的代码段展示了如何向hibernate处理程序说明被标记的元素是表的主 键,并映射名为“id”的列,并且主键是自动生成的。tdgcn cratcdveiluccolumn( name = ict )private int id;<span style二c

49、olor: #000000;为了指定标准的sql表列名,我们可以写如下 注解:</span>column( namc = "description")private string description;这说明被标记的元素映射的是这个类所对应的表中名为“description”的一 列。这些注解都来自?http:/docs, oracle, com/javaee/6/api/javax/persistence/package-sumin ary. html?企业级java的包。它们几乎涵盖了所有hibernate所有可用的注解。12. 3. spring mvc

50、spring是个被广泛使用的java企业级应用框架。其一项重耍的特性就是在java 程序使用依赖注入。spring使用注解作为xml (spring的早期版本使用的基于xml配置)的一种替 代方式。现在两者都是可行的。你可以使用xml文件或者注解配置你的项目。在 我看来两者都各有优势。我们将在下例中展示两个可用注解:componcntpublic class dependencyinjectionannotationprivate string description;public string getdescription()return description;©autowire

51、dpublic void setdescription( string description )this.description 二 description;在次代码片段屮我们可以找到两个使用在了类和方法上的注解。 component:说明被标记的元素,在木例中是一个类,是一个自动检测的目标。这 意味着被注解的类,将会被spring容器实例化并管理。 autowired: spring容器将会尝试通过类型(这是一种元素匹配机制)使用这个set 方法來自动装配。此注解也可以使用在构造器和属性上,spring也会根据注解的地 方不同采取不同的操作。更多关于依赖注入和spring框架的细节请参考:

52、 http:/projccts spring. io/spring-framework/.12. 4. findbugs这是一个用來测量代码质量,并提供一系列可能提高它的工具。它会根据预定义 (或者自定义)的违反规则来检查代码。findbugs提供一系列注解来允许开发 者來改变默认行为。它主要使用反射读取代码(和包含的注解)并决定基于它们,应该采取什么行为。一个列子是 edu. umd. cs. findbugs, annotations. suppressfbwarnings 注解期 待一种违反规定的键值并把它当作参数。这非常像java. lang. suppresswarningso被用来

53、向findbugs说明当执行代码分析的时 候,忽略指定的违反规则。这是一个例子:suppressfbwarnings( he_equals_use_hashcode )public class findbugsannotated ©overridepublic boolean equals( object argo )return super, equals( argo );这个类已经重现了 object的equals方法,但是并没有重写hashcode方法。 这通常'会导致问题,因为hashcode和equals两者应该被同吋重写,否则在使 用这个对象作为hashmap的k

54、ey值的时候会导致错误。所以,findbugs会在违 反规则报告中创造一个错误条目。如果注解 ©suppressfbwarnings 设置了 he_equals_use_hashcode 值以后,处 理程序就不会在抛出这类型的错误了。bug:com. danibuiza. javacodegeeks, findbugsannotations. findbugsannotated defines equals emd uses object.hashcodcobug:com. danibuiza. javacodegeeks, f indbugsannotations. findbug

55、sannotated defines equals and uses object. hashcode()这个类重写了 equals方法,但是没有重写hashcode方法,继承自 java. lang. object的hashcode方法(返回每个对象被jvm赋予的特定值)。 因此,这个类几乎违反了相同的对象必须hashcodc相同的一致性。如果你认为这个类的实例不会插入到哈希表,推荐的做法是像这样实现 hashcode 方法:public int hashcode() assert false : "hashcode not designed;return 42; / any ar

56、bitrary constant wi11 dorank: troubling (14), confidenee: highpattern: 11e_equals_use j iasi 1c0detype: he, category: bad practice (bad practice)这个错误包含了该问题的一种解释并口提示如何处理它。在这种情况下,解决方 案应该是实现hashcode方法。想知道findbugs在suppressfbwarnings注解所有可用的违反规则设置,请参 考:http:/findbugs. sourceforge. net/bugdescriptions. htm

57、l.125 jaxbjaxb是一个用来相互转换和映射xml文件与java对象的类库。实际上,这个类 库与标准jre起提供,不需要任何额外的下载和配置。可以直接通过引入 java. xml. bind, annotation 包下的类直接使用。jaxb使用注解來告知处理程序(或者是jvm) xml文件与代码的相互转化。例如, 注解可以用來在代码上标记xml节点,xm1屈性,值等等。我们将看到一个例了:首先,我们声明一个类说明它应该是xml文件中的一个节点:import javax.xml. bind, annotation. xmlrootelement;import javax. xml. b

58、ind, armotation. xmltype;xmltype( proporder 二 "brand", "model", "year",)xmlrootelcment( name = "car")class car使用注解xmltype, xmlroootelement<>它们用来告知jaxb处理程序car这 个类在转换后,将会转换成为xml中的一个节点。这个xmltype说明了属性在 xml中的顺序。jaxb将会基于这些注解执行合适的操作。除了分离的getter和setter属性,再也不需要向这个类屮添加其它东西来完 成转换。现在我们需要一个消费器程序來执行转换成xml:car car = new car (); car.setbrand( "mercedes");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论