在Java中創建自定義注解
創建自定義注解與編寫接口很相似,除了它的接口關鍵字前有個@符號。
注意以下幾點:
·注解方法不能有參數。
·注解方法的返回類型局限於原始類型,字符串,枚舉,注解,或以上類型構成的數組。
·注解方法可以包含默認值。
·注解可以包含與其綁定的元注解,元注解為注解提供信息,有四種元注解類型:
-
@Documented – 表示使用該注解的元素應被javadoc或類似工具文檔化,它應用於類型聲明,類型聲明的注解會影響客戶端對注解元素的使用。如果一個類型聲明添加了Documented注解,那么它的注解會成為被注解元素的公共API的一部分。
-
@Target – 表示支持注解的程序元素的種類,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等等。如果Target元注解不存在,那么該注解就可以使用在任何程序元素之上。
-
@Inherited – 表示一個注解類型會被自動繼承,如果用戶在類聲明的時候查詢注解類型,同時類聲明中也沒有這個類型的注解,那么注解類型會自動查詢該類的父類,這個過程將會不停地重復,直到該類型的注解被找到為止,或是到達類結構的頂層(Object)。
-
@Retention – 表示注解類型保留時間的長短,它接收RetentionPolicy參數,可能的值有SOURCE, CLASS, 以及RUNTIME。
以下是一個簡單自定義注解的實現過程:
首先創建自定義注解類Annotations,代碼如下:
package com.dalaoyang.test;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Annotations {
long time() default -1;
}
寫一個簡單的實現類:
package com.dalaoyang.test;
import java.util.Date;
/**
* @author dalaoyang
* @Description
* @project java_custon_annotations
* @package com.dalaoyang.test
* @email 397600342@qq.com
* @date 2018/3/27
*/
public class DoSomeThing {
public void test() {
System.out.println("執行自定義注解");
System.out.println("執行自定義注解結束時間:"+new Date());
}
}
然后寫一個使用注解的類:
package com.dalaoyang.test;
public class Test {
private DoSomeThing doSomeThing= new DoSomeThing();
@Annotations
public void test(){
doSomeThing.test();
}
}
最后利用反射,使注解可以使用:
package com.dalaoyang.test;
import java.lang.reflect.Method;
import java.util.Date;
// 反射注解
public class AnnotationsRunner {
public static void main(String[] args) throws Exception {
System.out.println("執行自定義注解開始時間:"+new Date());
Class clazz = Test.class;
Method[] ms = clazz.getMethods();
for (Method method : ms) {
boolean flag = method.isAnnotationPresent(Annotations.class);
if (flag) {
method.invoke(clazz.newInstance(), null);
}
}
}
}
執行AnnotationsRunner類中得main函數,可以看到控制台如下所示: