@深入注解,在Java中设计和使用自己的注解

Posted Fight With Me!!!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@深入注解,在Java中设计和使用自己的注解相关的知识,希望对你有一定的参考价值。

我们用过 JDK给我们提供的  @Override  @Deprecated @SuppressWarning 注解  ,这些注解是JDK给我们提供的 ,我们只是在用别人写好的东西 ,那么我们是否可以自己写注解呢?当然是可以的  。

我们写的注解包括三个环节 

1、 注解的声明 ,也就是注解类的定义     形式如下        @interface 来进行注解的声明

package me.test;   

import java.lang.annotation.* ;//导入注解包中所有注解

@Retention(RetentionPolicy.RUNTIME)   //解释如下

@Target(ElementType.TYPE)//解释如下

public @interface MyAnnotation              

}

 

@Retention(RetentionPolicy.RUNTIME)   

指定了注解保留的周期 注解的生命周期有是三个   RetentionPolicy 枚举的三个值代表了三个声明周期  默认是CLASS

 

枚举常量摘要

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

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

SOURCE
          编译器要丢弃的注释。

 

 

@Target(ElementType.TYPE) 

这个标识注解应该标在那里   ElementType的几个枚举值就代表了  注解应该写在的位置

 

CONSTRUCTOR
          构造方法声明

FIELD
          字段声明(包括枚举常量)

LOCAL_VARIABLE
          局部变量声明

METHOD
          方法声明

PACKAGE
          包声明

PARAMETER
          参数声明

TYPE
          类、接口(包括注释类型)或枚举声明

 

 

2、 使用了注解的类 或者方法 

@MyAnnotation

class  A

{
}

 

3、 利用反射来操作注解   详细见代码

Class类有一个 方法

 

<A extends Annotation
A   getAnnotation(Class<A> annotationClass)

 

这个方法接受一个注解的字节码参数  ,然后返回这个类所标识的注解对象 ,因为我们标识了一个注解就相当于产生了一个注解对象  。

 

booleanisAnnotationPresent(Class<? extends Annotation> annotationClass)

 

这个方法判断一个类是否被注解所标识

 

下面是代码示例

MyAnnotationTest.java中

package me.test;
import java.lang.annotation.Annotation;
@MyAnnotation 
public class MyAnnotationTest 
{  

    public static void main(String []args)
    {
     if(MyAnnotationTest.class.isAnnotationPresent( MyAnnotation.class))
     { 
       MyAnnotation an=(MyAnnotation)MyAnnotationTest.class.getAnnotation(MyAnnotation.class) ;
       System.out.println(an.toString()); 
     }
    }
}

MyAnnotation.java中

package me.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation 
{  

}

以上是关于@深入注解,在Java中设计和使用自己的注解的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Java:注解(Annotation)自己定义注解入门

深入理解Java:自定义java注解

[2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

深入JAVA注解(Annotation):自定义注解 (转)

深入理解Java:注解(Annotation)自定义注解入门

深入理解Java:注解(Annotation)自定义注解入门