注解的用法

来源:互联网 发布:电脑网络异常怎么修复 编辑:程序博客网 时间:2024/06/10 11:40

 注解:是用于描述程序如何运行以及在什么阶段来运行,注解在实际开发中最大的功能是用于替换配置文件,注解是jdk1.5的新特性,可以通过反射来让注解具有功能。

1.      自定义注解

public  @interface注解名{}

例:public @interface MyAnnotation{}

注解它的本质就是一个接口,这个接口继承Annotation接口。注解类反编译后:

public interface MyAnnotation extends java.lang.annotation.Annotation{}

 

2.      注解中的成员

注解本质上就是接口,接口中可以有属性方法,但是注解中的每一个方法其实是申明了一个配置属性,方法的名称就是参数的名称,返回值类型就是参数的类型,可以通过default来声明参数的默认值。

public @interface MyAnnotation {

   int age() default 18;

   String name();

   String value();

}

注解参数可支持的数据类型:

①  所有基本类型

②  String类型

③  Class类型

④  Enum类型

⑤  Annotation类型

⑥  以上所有类型的一维数组

Annotation类型里面的参数只能用public或默认(default)这两个访问权修饰,如果只有一个参数成员,最好把参数名设置为value,这样使用注解的时候可以直接赋值,而不用写参数名。

例:

有一个注解:

public @interface MyAnn{

String value();

}

使用:@MyAnn(“abc”)

 

 

 

 



3.      注解的使用

使用注解的时候,如果注解中的属性没有默认值就必须要赋值:

public class Demo1 {

   @MyAnnotation(name="aaa",value="bbb")

    public void test1(){

     

    }

}

4.      注解的反射

反射注解类

java.lang.reflect.AnnotatedElement:

l  <T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定类型的注解引用。没有返回null。

l  Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。

l  Annotation[] getDeclaredAnnotations():得到自己身上的注解。

l  boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判断指定的注解有没有。

Class、Method、Field、Constructor等实现了AnnotatedElement接口

5.      模拟@Test接口

①  定义注解类

@Retention(RetentionPolicy.RUNTIME)

public @interface MyTest {

}

 

②  使用注解

public class SomeDaoImpl {

 

   @MyTest

   public void add(){

      System.out.println("add方法执行了。。。。");

   }

  

   public void update(){

      System.out.println("update方法执行了。。。");

   }

}

 

③  模拟运行

public class Test1 {

 

   public static void main(String[] args) {

      Class clazz=SomeDaoImpl.class;

      Method[] methods=clazz.getDeclaredMethods();

      for(Method method:methods){

         MyTest myTest=method.getAnnotation(MyTest.class);

         if(myTest!=null){

            try {

                method.invoke(clazz.newInstance(), null);

            } catch (Exception e) {

                e.printStackTrace();

            }

         }

      }

   }

}

6.      元注解:只能用在注解上的注解

@Retetion : 作用,改变自定义的注解的存活范围,取值:RetetionPolicy.RESOURCE\RetetionPolicy.CLASS\RetetionPolicy.RUNTIME

@Target:作用,指定注解能用在什么地方,取值:ElementType.TYPE\ ElementType.METHOD\ ElementType.FIELD\ ElementType.ANNOTATION_TYPE

@Documented:作用,一个注解类上有@Documented注解,那么使用了该注解的类的API文档上会出现这个注解的身影

@Inherited:作用,说明该注解可以被继承下去

0 0
原创粉丝点击