之前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");
}
}
}