元数据,简单地说就是数据的数据,下面是从J2SE 1.5 in a Nutshell摘下来的J2SE 1.5 中的元数据特性提供了一个连接附加数据到Java Class,Interface,Method和Field中的能力.这些附加的数据或者注解能被javac编译器或者其他的工具识别,并且可以根据配置保存在class文件中,并且能在运行时通过Java的reflection API来发现.
给Java平台添加元数据的一个主要原因是似的开发和运行工具能得到一个基础框架,使得可以减少在编码和发布的时候需要的额外的努力.一个工具能使用这些元数据信息来产生一些额外的代码或者在调试的时候提供额外的信息.
代替元数据工具,下面的范例代码创建了一个智能调试的元数据注解.这个注解将在随后的调试中简单的显示出来.我们可以看到大部分的元数据标签组成了一个标准的,固定的集合.
import java.lang.annotation.*;
import java.lang.reflect.*;
                                                                                
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @interface debug  {
    boolean  devbuild() default false;
    int counter();
}
                                                                                
public class MetaTest {
    final boolean production=true;
    @debug(devbuild=production,counter=1) public void testMethod()  {
    }
 
                                                                               
    public static void main(String[] args) {
                                                                                
        MetaTest mt = new MetaTest();
        try {
            Annotation[] a = mt.getClass().getMethod("testMethod").getAnnotations();
            for (int i=0; i<a.length ; i++)  { 
                 System.out.println("a["+i+"]="+a[i]+" "); 
             } 
         } catch(NoSuchMethodException e) { 
             System.out.println(e); 
         } 
     } 
 }  
有了元数据处理工具,很多重复的编码步骤可以减少到一个简洁的元数据标签中.比如访问JAX-RPC的时候需要的远程接口服务实现可以按照下面这样实现:以前 Before  public interface PingIF extends Remote {
      public void ping() throws RemoteException;
  }
  public class Ping implements PingIF {
     public void ping() {
     }
  } 
用了元数据后 After  public class Ping {
     public @remote void ping() {
     }
  }