我們用過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)
這個方法接受一個註解的字節碼參數 ,然後返回這個類所標識的註解對象,因為我們標識瞭一個註解就相當於產生瞭一個註解對象 。
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
{
}
摘自 yue7603835的專欄