当前位置: 代码迷 >> Java相关 >> 注脚 (65)
  详细解决方案

注脚 (65)

热度:294   发布时间:2016-04-22 20:09:55.0
注解 (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、注解的实例化

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

  相关解决方案