Java之metadata元数据详解

上传人:壹****1 文档编号:490035781 上传时间:2023-04-27 格式:DOC 页数:18 大小:66KB
返回 下载 相关 举报
Java之metadata元数据详解_第1页
第1页 / 共18页
Java之metadata元数据详解_第2页
第2页 / 共18页
Java之metadata元数据详解_第3页
第3页 / 共18页
Java之metadata元数据详解_第4页
第4页 / 共18页
Java之metadata元数据详解_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《Java之metadata元数据详解》由会员分享,可在线阅读,更多相关《Java之metadata元数据详解(18页珍藏版)》请在金锄头文库上搜索。

1、Java之metadata(元数据)详解也可能刚听到元数据你会有点陌生,其实任何一个使用过struts,ejb或者hibernate的开发人员都在不知不觉中使用元数据。所谓的元数据是指用来描述数据的数据,更通俗一点就是描述代码间关系,或者代码与其它资源(例如数据库表)之间内在联系得数据,对Struts来说就是struts-config.xml,对ejb来说就是ejb-jar.xml和厂商自定义的xml文件,对hibernate来说就是hbm文件。但是现有的所有的以xml或者其它方式存在的元数据文件都有以下一些不便之处,第一,与被描述的文件分离,不利于一致性维护。第二,所有的这些文件都是asci

2、i文件,没有显示的类型支持。基于元数据的广泛应用JDK1.5引入了Annotation的概念来描述元数据。使用过.net的开发人员一定很熟悉元数据的概念,元数据的概念在.net中成为Attribute。在Java中元数据以标签的形式存在于Java代码中,元数据标签的存在并不影响程序代码的编译和执行,它只是被用来生成其它的文件或针在运行时知道被运行代码的描述信息。综上所述:第一,元数据以标签的形式存在于Java代码中o第二,元数据描述的信息是类型安全的,即元数据内部的字段都是有明确类型的。第三,元数据需要编译器之外的工具额外的处理用来生成其它的程序部件。第四,元数据可以只存在于Java源代码级别

3、,也可以存在于编译之后的Class文件内部。如何创建元数据类型像各种类有可以定义不同的类型一样,原数据也可以定义不同的类型。现在为止,Java语言中已经有了四种种的类型:对象类(class),枚举(enum),接口(interface)和元数据(interface)。其实Java中的元数据的概念即吸收了.Net中Attribute的概念,有吸收了.net中property的概念。Annotation定义Annotation定义语法为:modifiersinterfaceAnnotationName(elementdeclarationlelementdeclaration2)modifiers

4、指:public,protected,private或者默认值(什么也没有)O个元素的声明(elementdeclaration)指:typeelementName();或者typeelementName()defaultvalue;例如下面代码定义了一个Annotation:publicinterfaceBugReport(StringassignedTo()defaultnone;intseverity()=0;而可以通过以下的方式来声明Annotation:AnnotationName(elementName1=value1,elementName2=value2,.)元数声明的顺序没有

5、关系,有默认值的元素的声明可以不列在初始化表中,此时他们使用默认值。例如,根据上述定义如下的三个Annotation的声明是等价的:BugReport(assignedTo=Harry,severity=0)BugReport(severity=0,assignedTo=Harry)BugReport(assignedTo=Harry)那些只有一个元素,且元素名字叫value的Annotation可以使用如下的方式声明:AnnotationName(somevalue”)Annotation中元素的类型必须是下述类型,或者这些类型的组合:l基本类型(int,short,long,byte,ch

6、ar,double,float,orboolean)l字符仓ij(String)l类(Class(可以是形如Class)的泛型类)l枚举类型(enum)l一个Annotation类型(annotation)l上述类型构成的数组如果Annotation的元素是数组,则可以做如下声明:BugReport(.,reportedBy=Harry,Carl)如果数组中只有一个元素时可以做如下声明:BugReport(.,reportedBy=Joe)/OK,sameasJoe如果Annotation元素类型为Annotation时可以做如下声明:BugReport(testCase=TestCase(i

7、d=3352627”),.)可以对如下对象添加Annotation:lPackageslClasses(includingenum)lInterfaces(includingannotationinterfaces)lMethodslConstructorslInstancefields(includingenumconstants)LocalvariablesParametervariables冰准的AnnotationJDK1.5提供了若干的标准Annotation来补充语法定义,或者标记Annotation。标准的Annotation有以下几个:Annotation使用范围用途Depre

8、cated所有将目标标记为不推荐使用SuppressWarnings除了包和Annotation禁止标记对象发出被标记的警告信息Override方法标记这个方法重写了父类的方法TargetAnnotation标记Annotation的适用范围RetentionAnnotation标记Annotation最终驻留的地方DocumentedAnnotation该Annotation在JavaDoc文档中由现InheritedAnnotation该Annotation默认被使用该Annotation的所有子类继承下面具体讲解标准Annotation的用法。常用的Annotation包括以下三个:De

9、precatedSuppressWarningsOverride,他们的用途分别如上表所示。以下说明的Annotation有一个共同的特点就是他们都只能用在Annotation的声明上。Target用来标记Annotation适用的范围,Target有一些预定义的属性,如下表所示:类型适用范围ANNOTATION_TYPE只能用在Annotation的声明中PACKAGE用在包上Annotation)TYPE类(包括枚举)或者接口(包括METHOD方法CONSTRUCTOR构造方法FIELD字段(包含枚举内部的常量)PARAMETER方法或者构造方法的参数LOCAL_VARIABLE本地变量R

10、etention用来标记Annotation在那些范围(源代码,类文件或者运行时)内是可用的。Retention与定义了一些属性,如下表所示:驻留策略描述SOURCEAnnotation只存在于源代码中,不包括在编译生成Class文件中CLASSAnnotation存在于源代码中,也存在于编译生成的Class文件中,但是在运行时这些Annotation不被JVM装载。RUNTIMEAnnotation存在于源代码中,也存在于编译生成的Class文件中,同时在运行时这些Annotation被装载到JVM内部,可以使用反射的机制在运行时使用。Documented用来将Annotation显示在生成

11、的JavaDoc中。Inherited只能用来标记用在类上的Annotation,用来说明被标记的Annotation会被该类的所有子类自动的继承。Annotation应用实例/*http:/www.onjava.eom/pub/a/onjava/2005/01/19/metadata_validation.html*byJacobHookom*/使用Annotation的一个例子就是建立一个简单的用户输入验证框架,使用这个框架最终用户可以以如下的方式来定义字段的校验属性:ValidateRequiredValidateEmailpublicvoidsetEmail(Stringemail)t

12、his.email=email;)ValidateRequiredValidateLength(min=6,max=12)publicvoidsetPassword(Stringpassword)this.password=password;)以上的代码说明,email字段是必须的,且必须满足email的校验要求,同时password字段也是必须的,且长度必须在612之间。有了这些定义之后我们能够使用如下的代码达到验证的效果:Validator.validate(loginBean,email,);/passValidator.validate(loginBean,password,);/fa

13、ilure要能够达到上述的要求,我们必须定义一些Annotation,以下代码是ValidateLength和ValidateExpr的声明:packageannotations.validates;/ExampleValidateLength(min=6,max=8)publicinterfaceValidateLengthintmin()default0;intmax()defaultInteger.MAX_VALUE;)/ExampleValidateExpr(A(w)0,2$);publicinterfaceValidateExprStringvalue();具体开发的过程中我们会遇到

14、一些问题,这主要由于两方面的原意产生第一,Annotation内部不能定义方法,只能定义一些状态。第二,Annotation不允许使用继承(extends或者implements),这意味着我们不能在反射的过程中使用instanceof这样的功能。为了识别由于我们定义的校验相关的Annotation我们定义了个如下的Annotation:packageannotations.validates;importjava.lang.annotation.*;Retention(RetentionPolicy.RUNTIME)Target(ElementType.ANNOTATION_TYPE)pub

15、licinterfaceValidate/Classvalue();Classvalue();正如你所看到的Validate可以驻留在JVM内部,即它可以在运行时通过反射的方式使用。同时它必须用来标记其他的Annotation,同时他有一个Class类型的value元素,这个类型必须从ValidateHandler继承而来,主要用来处理具体的验证逻辑。在此设计之下看看我们如何声明一个ValidateExpr的Annotation对象:packageannotations.validates;importjava.lang.annotation.*;Retention(RetentionPolicy.RUNTIME)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 演讲稿/致辞

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号