savage1984
发贴: 3
积分: 0
|
于 2004-10-23 20:04
jdk5.0出来有一阵子了,这一次的版本更新不同于以往,它带来了很多里程碑式的革新,SUN将其绰号取名为tiger(虎),这一次的变革将是 Java诞生以来从未有过的,它给我们带来了耳目一新的感觉。在这里,我简单介绍一下metadata,关于泛型可以看我的另一篇文章jdk5.0初探- -generics,其他的一些简单改动,可以参考jdk的文档: 元数据(metadata)可用于编译时的注释,借此被JVM识认,也可以被动态加载进来,在动态调用时读取其注释。事实上注释是一个接口,在编译时被编译成一个独立的文件,以下声明一个简单的注释(Student_Name.java): import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME) //说明是用于运行时调用的 @Target(ElementType.METHOD) //说明该注释用于方法 public @interface Student_Name{ String name(); //声明一个简单的注释使用 } 以下是使用注释(Student.java): public class Student{ @Student_Name(name="王文银") public static void speak(){ System.out.println("Hello,World!"); }
} 注意这里的语法: @Student_Name(name="王文银"),上面已经声明了这个注释是用于方法的,在方法speak()的声明前使用,当编译器在编译这个文件时,先寻找Student_Name这个注释,然后动态加载进来,同时给了name一个值“王文银”,以下是测试(RunStudent.java): import java.lang.annotation.*; import java.lang.reflect.*;
public class RunStudent{ public static void main(String[] args) throws Exception{ for(Method m:Class.forName("Student").getMethods()){ //动态加载Student if(m.isAnnotationPresent(Student_Name.class)){ //表示使用了注释的speak()方法 m.invoke(null); //调用speak()方法。此时屏幕输出Hello,World! Student_Name a=m.getAnnotation(Student_Name.class); //获得方法的注释引用
System.out.println("Name:"+a.name()); //使用注释的方法,从而或得我们声明的 注释 } } } }
最后结果输出: Hello,World! Name:王文银
这样,我们在源文件里所用的注释就可以被编译器所调用,这些更加有助于程序员的动态控制,不需要另外的第三方的文件提供.
|