我們用過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
RUNTIME
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)
這個方法接受一個注解的字節碼參數 ,然後返回這個類所標識的注解對象 ,因為我們標識了一個注解就相當於產生了一個注解對象 。
boolean
isAnnotationPresent(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
- {
- }