使用Java 注解

来源:互联网 发布:淘宝怎么找代销 编辑:程序博客网 时间:2024/05/23 19:43

我们常常看到在一个子类重写父类的某个方法的时候,在这个子类重写的父类方法的前面会出现一行@Override,这个就是注解,它表示一个方法声明打算重写超类的另一个方法声明。如果方法利用此注释类型进行注解但是却没有重写超类的方法,则编译器会生成一条错误信息。还有如:@SuppressWarnings()指示应该在注释元素中取消显示指定的编译器警告。还可以自己定义自己的注解类型,格式如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotation {
String value();
}
上面定义了一个名叫MyAnnotation的注解类型,String value表示需要传递一个字符串类型的值给value属性。可以使用Target注解类型指示该自定义注解类型所适用的程序元素种类。
   ElementType.TYPE表示使用于类、接口或枚举声明。使用注解类型Retention来指示该注解类型要保留多久,RetentionPolicy.RUNTIME表示编译器将把注解记录在类文件中,在运行时VM将保留注解,因此可以反射性的读取。@Document表示该注解可以被写到文档里面。@Inherited表示该注解可以被子类继承,但是@Target必须的属性值必须为ElementType.TYPE才能被继承。 


对于大多数Programmer而言,在JPA中,Annotation其实就是OR-Mapping XML文件的替代者。注意,JPA中的Annotation都是RUMTIME的,从灵活性的角度将,我们往往希望使用配置文件而不是Annotation。
下面是我common-util下的一个关于Java代码的注释:终于通过这个例子让我彻底掌握了Annotation这东东。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaSource {
    String author() default "treeClimber"; /* 作者 */
    String email() default "xionglb@163.com"; /* 联系E_Mail */
    String company() default "http://www.treeclimber.cn/"; /* 公司名 */
    String project() default "common-util"; /* 所属项目 */
    String descript(); /* 类描述 */
    float version() default 1.0f; /* 版本号 */
    String created(); /* 创建时间 */
}
@Target( { ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface LastModified {
    int year();
    int month();
    int date();
    String modifier();
    String descript();
    String format() default "yyyy-MM-dd";
}
@JavaSource(version = 1.5f, project = "demoproj", descript = "学习Java5 Annotation", created = "2010-04-12")
public class JavaSourceTest {
    @LastModified(modifier = "xiongsl", year = 2010, month = 5, date = 5, descript = "Add the Method")
    public void say(String world) {
        System.out.println("Hello, " + world);
    }
    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        if (JavaSourceTest.class.isAnnotationPresent(JavaSource.class)) {
            JavaSource anno = JavaSourceTest.class.getAnnotation(JavaSource.class);
            System.out.println("Author:" + anno.author());
            System.out.println("Company:" + anno.company());
            System.out.println("Descript:" + anno.descript());
        }
        try {
            Method m = JavaSourceTest.class.getDeclaredMethod("say", String.class);
            LastModified anno = m.getAnnotation(LastModified.class);
            Date date = new Date(anno.year(), anno.month() - 1, anno.date());
            System.out.println("LastModified by " + anno.modifier() + " At "
                    + new SimpleDateFormat(anno.format()).format(date) + ", Note:"
                    + anno.descript());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

0 0
原创粉丝点击