這可能是最簡單實現自定義註解的文章了

註解的定義

註解通過@interface定義

<code>public@interfaceLog{

}
/<code>

它的關鍵字和接口定義方式差不多,只不過前面多了一個@符號

註解的應用

註解的應用方式很簡單在類或者方法的上方加一@xx就好了,具體的後面講

<code>publicclassController{

@Log

publicvoidtest(){

}

}

@Log

publicclassController{

publicvoidtest(){

}

}
/<code>

元註解

元註解:就是定義註解的註解,是一種基本的註解可以定義到註解上的註解

@Retention

用來說明註解的生命週期

@Retention(RetentionPolicy.SOURCE) 註解只在源碼階段保留,編譯期就被丟棄了

@Retention(RetentionPolicy.CLASS) 默認策略,註解只被保留到編譯進行的時候,它並不會被加載到 JVM 中。

@Retention(RetentionPolicy.RUNTIME) 註解可以保留到程序運行的時候,它會被加載進入到 JVM 中,所以程序運行時也可以獲取到它。

@Documented

Documented註解表明這個註釋是由 javadoc記錄的,在默認情況下也有類似的記錄工具。 如果一個類型聲明被註釋了文檔化,它的註釋成為公共API的一部分。

@Target說明註解的作用目標

@Target(ElementType.TYPE) 接口、類、枚舉、註解

@Target(ElementType.FIELD) 字段、枚舉的常量

@Target(ElementType.METHOD) 方法

@Target(ElementType.PARAMETER) 方法參數

@Target(ElementType.CONSTRUCTOR) 構造函數

@Target(ElementType.LOCAL_VARIABLE) 局部變量

@Target(ElementType.ANNOTATION_TYPE) 註解

@Target(ElementType.PACKAGE) 包

@Inherited

@Inherited:如果一個使用了此註解的註解1,被一個class使用,那麼這個註解1也對class的子類生效。例如:

<code>@Inherited

@Target(ElementType.METHOD)

public@interfaceLog{

}

@Log

publicclasstestA(){}

publicclasstestB()extendstestA{}
/<code>

testA應用了@Log這個註解,那麼testB這個類上面也有@Log這個註解。

@Repeatable

例如:

<code>@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public@interfaceLogs{

Log[]value();

}

@Repeatable(Logs.class)

public@interfaceLog{

Stringdescr()default"";

}

publicclassController{

@Log(descr="描述1")


@Log(descr="描述2")

publicvoidtest(){

}

}

publicclassLogRunner{

publicstaticvoidmain(String[]args)throwsException{

System.out.println("開始時間:"+newDate());

Classclasss=Controller.class;

Method[]ms=classs.getMethods();

for(Methodmethod:ms){

booleanflag=method.isAnnotationPresent(Logs.class);

if(flag){

Logslogs=method.getAnnotation(Logs.class);

for(Loglog:logs.value()){

System.out.println(log.descr());

}

}

}

}

}
/<code>

輸出的時候就會輸出,描述1,描述2.

實現自定義註解

第一步先定義一個註解

<code>@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

@Documented

public@interfaceLog{

StringmethodName()default"defaultAMethod";

Stringcontroller()default"defaultController";

Stringdescr()default"defaultDescr";

}
/<code>

第二步應用這個註解

<code>publicclassController{

@Log

publicvoidtest(){

System.out.println("結束時間:"+newDate());

}

}
/<code>

第三步通過反射讓這個註解起作用

<code>publicclassLogRunner{

publicstaticvoidmain(String[]args)throwsException{

System.out.println("開始時間:"+newDate());

Classclasss=Controller.class;

Method[]ms=classs.getMethods();

for(Methodmethod:ms){

booleanflag=method.isAnnotationPresent(Log.class);

if(flag){

Loglog=method.getAnnotation(Log.class);

System.out.println(log.methodName());

System.out.println(log.descr());

System.out.println(log.controller());

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

}

}

}

}
/<code>

輸出

這可能是最簡單實現自定義註解的文章了

image


輸出結果


如果將第二步方法上面的註解不使用默認的value,將代碼改成

<code>publicclassController{

@Log(methodName="test",controller="testController",descr="測試")

publicvoidtest(){

System.out.println("結束時間:"+newDate());

}

}
/<code>

那麼將會輸出

這可能是最簡單實現自定義註解的文章了


輸出結果


原諒我當了一把標題黨,各位知友請見諒。

歡迎大家關注公眾號:千珏(jue),後臺給我留言呀。


這可能是最簡單實現自定義註解的文章了


分享到:


相關文章: