码迷,mamicode.com
首页 > 其他好文 > 详细

注解 (65)

时间:2015-05-20 09:29:06      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:

1:所有注解都是类

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

3:定义方式:

       public @interface SomeAnotation{

}

 

4:可以注解的位置

     类上

              方法上

              成员变量上。

              返回值上

              参数上

              局部变量

import org.junit.Test;
@MyTest
public 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、注解的实例化

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

注解 (65)

标签:

原文地址:http://www.cnblogs.com/zhenghongxin/p/4515338.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!