http://www.javayou.com (收藏,设为首页)
当你不能再拥有时,你唯一能做的,就是让自己不要忘记 (手机请访问 http://3g.dlog.cn/javayou)
上一篇:SHA-1 Broken 下一篇:Linux下让Apache支持SSL

元数据(注释)- J2SE5之5

2005年2月17日(Thursday) 14点52分 作者: 梁夏峰 天气: 心情: 一般

Metadata,元数据,是Tiger重要的改进之一,也叫注释(Annotate),这个改进的前身,有大家熟悉的JavaDoc。

作为重要的改进,不少开发组织已经越来越多的开始使用元数据,如EJB3中将大力采用元数据。元数据作为附加数据或注释,可以被javac编译器或其他工具读取,并根据不同的属性指定,可以选择被保存在类文件中,也可以保存到运行时,并通过Java的反射机制提供调用,从而提供了广阔的使用空间,相信今后的Java开发中大家少不了要熟练掌握和使用它。

元数据,定义是数据的数据,比如做数据挖掘时,依据原始的数据提取出的供上层管理人员查看和分析的数据(上层管理人员更关注他们关注的数据,而不是基础业务数据),上述所提的原始数据就叫元数据。

元数据有3类作用:文档编制、编译器检查和代码分析。

先简单介绍3个Tiger内置的元数据:
Override、Deprecated和SuppressWarnings。

注释的使用通过"@"+注释名称的方式,@为我们熟悉的at标记,如果注释后面有参数,则使用paraName = paraValue的方式,类似方法的调用。

1)Override:
声明Override父类的方法,如果父类无此方法将提示错误,可以避免错误:

@Override
public String toString() {
    return super.toString();
}

表示Override toString方法,如果把toString改为ToString,则编译会报错误表示必须Override父类的方法。

2)Deprecated:
用于对不应再使用的方法进行注释,如果覆盖或调用声明为Deprecated的方法,编译器将提示警告。
Deprecated的使用比较特殊,必须放在方法前:

@Deprecated public doSomething() {
    ... ...
}

3)SuppressWarnings:
是Tiger的所有新功能的副功能,如我们在使用5.0的jdk编写jdk1.4.x和以前版本jdk的应用时,会发现常使用的方法在编译时会报出一大堆的警告,如:List testList = new ArrayList(); 会警告没有定义类型,不是类型安全的代码,此时需要在含此定义的方法里,使用该 SupperssWarnings:

@SuppressWarings(value={"unchecked"})
public void test() {
    List testList = new ArrayList();
    testList.add("test");
}

以上是内置的注释,接下来看看怎么定义自己的注释类型,这才是最可以扩展和值得关注的部分:

定义一个注释类型:

package javayou.demo.j2se5;
import java.lang.annotation.*;

/**
 * 注释的保持特性,
 *     此处定义注释类型AuthorDetail将保留至JVM装载,供JVM读取
 */
@Retention(RetentionPolicy.RUNTIME)

/*
 * 定义元注释,即允许何种程序元素具有定义的注释类型,
 *     避免在其他地方误用此注释
 */
@Target(ElementType.METHOD)

/**
 * 定义一个注释类型,需要在interface前加:@
 */
public @interface AuthorDetail {
        //定义有3个属性
        String name();
        String email();
        String callExtension();
}

使用例子:

package javayou.demo.j2se5;
import java.lang.annotation.Annotation;

public class MetadataDemo {
    @AuthorDetail(name="Liang.xf",
        email="
javayou@gmail.com", callExtension="351")
    public void demo() {
        System.out.println("MetadataDemo方法调用");
    }
    public static void main(String[] args) {
        MetadataDemo metadata = new MetadataDemo();
        try {
            Annotation[] annotation = metadata.getClass(
                ).getMethod("demo").getAnnotations();
            for (Annotation a : annotation) {
                System.out.println("作者: "+
                    ((AuthorDetail) a).name());
                System.out.println("邮箱: "+
                    ((AuthorDetail) a).email());
                System.out.println("分机: "+
                    ((AuthorDetail) a).callExtension());
            }
            System.out.println("--------------");
            metadata.demo();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:

作者: Liang.xf
邮箱:
javayou@gmail.com
分机: 351
--------------
MetadataDemo方法调用

注释类型的定义:创建一个interface,在interface前加上符号:@
注释类型的定义里,使用了@Retention,它是一种对注释类型的注释,共有4种预定义的注释类型(称为元注释),分别为Retention、Target、Documented和Inherited,它们的含义如下:

1)Target
定义允许何种程序元素可以具有此处定义的注释类型,它的值引用了ElementType的枚举类型,ElementType:

package java.lang.annotation;
public enum ElementType {
  TYPE,        // Class, interface, or enum (but not annotation)
  FIELD,                 // Field (including enumerated values)
  METHOD,             // Method (does not include constructors)
  PARAMETER,        // Method parameter
  CONSTRUCTOR,    // Constructor
  LOCAL_VARIABLE,    // Local variable or catch clause
  ANNOTATION_TYPE, // Annotation Types (meta-annotations)
  PACKAGE                // Java package
}

2)Retention
定义注释类型的保存方式,值引用了枚举类型RetentionPolicy的值,

package java.lang.annotation;
public enum RetentionPolicy {
  SOURCE,       // Annotation is discarded by the compiler
  CLASS,         // Annotation is stored in the class file, but ignored by the VM
  RUNTIME       // Annotation is stored in the class file and read by the VM
}

3)Documented:
Documented 表示注释应该出现在类的Javadoc中,而默认情况下,注释不包括在 Javadoc 中。

4)Inherited:
表示定义的注释类型将具备继承属性,使用该注释类型的类被继承时,其子类仍具备父类的注释。

元数据比较复杂,而且应用面比较广,在实际开发和应用中摸索和引入是最好的,这里没有举出实际应用案例,只是介绍了其简单的用法,具体的案例在以后的实际应用经验中给予提供。

标签: j2se 
评论者: 刘冬 2005-2-19 12:40 (Saturday)
Eclipse 3.1 M5 Due Today

For those following the Eclipse 3.1 stream, M5 is due today.

They tend to come late in the afternoon, so don't go overloading the download site just yet. I'll be updating this throughout the day as I see progress on this front.

Update (5:35 EST): Unusual, but no sign of M5 yet.

评论者: 刘冬 2005-2-19 15:38 (Saturday)

Eclipse 3.1 M5 可以下载了, 下载地址是:

http://download.eclipse.org/downloads/index.php

评论者: 刘冬 2005-2-19 17:39 (Saturday)

下载了,升级了,Lomboz用不了了!

不过没关系,我现在都是用的velocity,velocity的插件好使就行:)

评论者: 刘冬 2005-2-21 10:15 (Monday)
晕死了,昨天刚下载的M5版,今天一看变成M5a了,不知道有什么区别啊
评论者: 刘冬 2005-2-22 09:08 (Tuesday)

终于明白了M5跟M5a的区别了:

A problem was discovered in 3.1M5 that causes crashes with EMF editors and others using IPropertySheetPage. See bug 84731 for progress. I recommend holding off on the big download for a day or two until they have this fixed.

Update: The new build is now available as 3.1M5a.

评论者: 刘冬 2005-3-19 14:55 (Saturday)

Using Annotations to add Validity Constraints to JavaBeans Properties

http://java.sun.com/developer/technicalArticles/J2SE/constraints/annotations.html

评论者: 刘冬 2005-5-2 21:13 (Monday)

郁闷,JDK 1.5的第三个更新版出来了,也太快了吧?

http://java.sun.com/j2se/1.5.0/ReleaseNotes.html

下载地址:http://java.sun.com/j2se/1.5.0/download.jsp

姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验