首页 > 学院 > 开发设计 > 正文

注解 (65)

2019-11-15 00:14:17
字体:
来源:转载
供稿:网友
注解 (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、注解的实例化

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表