Anntation(注解)-----Java之辅助工具(大有前途)

来源:互联网 发布:java程序员桌面壁纸 编辑:程序博客网 时间:2024/05/18 02:43

之前Junit工具就有用到注解,可以单独调试程序,如 @Test ,@Override等这些就是注解。原先JUnit工具可以点击查看点击打开链接。现在介绍如何做出的注解

 元数据

所谓元数据就是数据的数据。也就是说,元数据是描述数据的。就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义。
       元数据可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。许多元数据工具,如XDoclet,将这些功能添加到核心Java语言中,暂时成为Java编程功能的一部分。
        一般来说,元数据的好处分为三类:文档编制、编译器检查和代码分析。代码级文档最常被引用。元数据提供了一种有用的方法来指明方法是否取决于其他方法,它们是否完整,特定类是否必须引用其他类,等等。 

什么是注解:

    Java中的注解就是Java源代码的元数据,也就是说注解是用来描述Java源代码的。  基本语法就是:@后面跟注解的名称。如 @Test.

Java中预定义注解 :(Java.Lang.Anntation)

①Override:标识某一个方法是否正确覆盖了它的父类的方法。
②Deprecated:表示已经不建议使用这个类成员了。  它是一个标记注解。
③SuppressWarnings:用来抑制警告信息。


自定义注解1:

自定义注解的语法很简单,跟定义接口类似,只是在名称前面加上@符号。 

<span style="font-size:18px;">public @interface MyAnno {<span style="white-space:pre"></span>}//最简单的,不带任何注释的</span>
<span style="font-size:18px;">使用:</span>
<span style="font-size:18px;"><span style="white-space:pre"></span></span><pre name="code" class="java">@MyAnno//这是限制类public class UserModel{} 

为注解添加成员

<span style="font-size:18px;">//定义public @interface MyAnno {  public String schoolName();}</span>

使用:

<span style="font-size:18px;">@MyAnno(schoolName="湖南城市学院")public class UserModel{} </span>
<span style="font-size:18px;">//使用2@MyAnno(schoolName="城院Java高手训练营")public class UserModel{</span><span style="font-size:14px;">}</span>
以上只是简单地介绍,不仅如此,还可以对注解进行注解,也就是说可以限制,是否作用于类 @Target(ElementType.TYPE),变量,方法@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE }),下面的代码有详细介绍

对注解的注解:

☆指定目标 Target

在了解如何使用Target 之前,需要认识另一个类,该类被称为ElementType (通过API详细学习) ,它实际上是一个枚举。这个枚举定义了注释类型可应用的不同程序元素。 

☆设置保持性 Retention(@Retention(RetentionPolicy.SOURCE) )编译器要丢弃的注释

@Retention(RetentionPolicy.Class)编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。这是默认的行为。

@Retention(RetentionPolicy.RUNTIME)编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。 (很重要,进行类反射的时候,后面的例子会看到)

 RetentionPolicy (通过API详细学习)枚举类中定义了3种注解保持性,分别决定了Java 编译器以何种方式处理注解。  

☆添加公共文档 Documented

在默认的情况下在使用javadoc自动生成文档时,注解将被忽略掉。如果想在文档中也包含注解,必须使用Documented为文档注解

☆设置继承 Inherited 

在默认的情况下,父类的注解并不会被子类继承。如果要继承,就必须加上Inherited注解。 

下面给出具体的实例:

注解类:

<span style="font-size:24px;">package cn.hncu.Annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Inherited@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE })//定义,可以使用方法,变量,public @interface MyAnno {public String   getname() default "哈哈";//设置默认值,以后可以根据参数修改来进行不同的操作//public String   getname2() ;//不设置}</span>
使用注解的简单类

/** *  */package cn.hncu.Annotation;/** * @author xinxin * */@MyAnnopublic class MyTestAnnoimp {@MyAnnoprivate int age;private String name;public static void main(String[] args) {}@MyAnnopublic int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "MyTestAnno [age=" + age + ", name=" + name + "]";}}
对实用类进行判断是否用到了此注解

/** *  */package cn.hncu.Annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Target;import java.lang.reflect.Method;/** * @author xinxin * */public class Demo {public static void main(String[] args) throws Exception {Class c1=Class.forName("cn.hncu.Annotation.MyTestAnnoimp");//判断类是否是注解类型,之前没有@Target(ElementType.TYPE),flg一直显示为false boolean flg=c1.isAnnotationPresent(MyAnno.class);Method ms[] = c1.getDeclaredMethods();//判断方法是否是该种类型的注解for(Method m: ms){boolean boo = m.isAnnotationPresent(MyAnno.class);System.out.println("mm:"+boo+"  :: "+m.getName());}System.out.println(MyAnno.class);System.out.println(flg);if(flg){MyAnno my=(MyAnno) c1.getAnnotation(MyAnno.class);//符合就输出做出相应的反应System.out.println(my.getname());//得到相应用户名之后就可以作出相应的事了}else{System.out.println("nonono");}}}


0 0
原创粉丝点击