之前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 * */ @MyAnno public class MyTestAnnoimp { @MyAnno private int age; private String name; public static void main(String[] args) { } @MyAnno public 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; } @Override public 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"); } } }