你的位置:首页 > Java教程

[Java教程]注解 (65)


1:所有注解都是类

2:所有注解类都默认是Annotation接口的子类。

3:定义方式:

       public @interface SomeAnotation{

}

 

4:可以注解的位置

     类上

              方法上

              成员变量上。

              返回值上

              参数上

              局部变量

import org.junit.Test;@MyTestpublic class RunTest {  @MyTest  private int age;  @MyTest()  public void tt(@MyTest()int a){    @MyTest    int xx=0;  }}

5:如果定义了一个注解之后,没有说明这个注解可以注解的位置,则这个注解就可以注解在所有位置上

 

以下定义某个注解只可以注解到方法上:import java.lang.annotation.ElementType;import java.lang.annotation.Target;//设定注解可以注解的位置@Target(value={ElementType.METHOD})public @interface MyTest {}

 

6:用途

6.1:在编译时起到限制的作用.

  public class MyServlet extends HttpServlet {  @Override  public void doGet(ServletRequest req,String name)      throws ServletException, IOException {  } }

 6.2:在运行时组反射使用

 

              所有类的字节码Class,Method,Field,Constractor都拥有一个方法:

 

boolean

isAnnotationPresent(Class<? extends Annotation> annotationClass)
          如果指定类型的注解存在于此元素上,则返回 true,否则返回 false。

 

       注解存在的范围:

 

       一个类:Retention,用于定义注解存在的策略:

     java.lang.annotation

 枚举 RetentionPolicy

 

三个常量:

 

枚举常量摘要

CLASS
          编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。 在.class存在,在运行时擦除

 

RUNTIME
          编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。运行时存在。

 

SOURCE
          编译器要丢弃的注释。只在.java文件中存在@Overied

 

以下是经常使用的标准定义:

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD})public @interface MyTest {}

以下是myUnit的测试类:  核心方法:  public class MyUnit {  public static void main(String[] args) throws Exception {    System.err.println("请输入准备被测试的类:");    Scanner sc = new Scanner(System.in);    String clsName = sc.nextLine();//clsName = "cn.itcast.demo.RunTest";    //根据类名获取这个类的字节    Class cls = Class.forName(clsName);    //实例化这个类,调用默认构造方法    Object obj = cls.newInstance();        //获取这个类中的所有方法    Method[] ms = cls.getDeclaredMethods();//只获取用户定义的方法,private && public    //cls.getMethods();获取这个类所方法,包括从父类中继承的方法    //遍历判断某个方法上是否存在注解    for(Method m:ms){      boolean boo2 = m.isAnnotationPresent(MyTest.class);//false       if(boo2){        if(m.getModifiers()==Modifier.PRIVATE){          System.err.println("这个私有的方法:"+m.getName()+",不支持运行...");          continue;        }        //运行这个方法        m.invoke(obj);      }    }

 

 

7、注解的实例化

       永远都不要实例化注解类,因注解是由系统通过反射实例化的。