註解的定義
註解通過@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>
輸出
![這可能是最簡單實現自定義註解的文章了](http://p2.ttnews.xyz/loading.gif)
image
輸出結果
如果將第二步方法上面的註解不使用默認的value,將代碼改成
<code>publicclassController{
@Log(methodName="test",controller="testController",descr="測試")
publicvoidtest(){
System.out.println("結束時間:"+newDate());
}
}
/<code>
那麼將會輸出
![這可能是最簡單實現自定義註解的文章了](http://p2.ttnews.xyz/loading.gif)
輸出結果
原諒我當了一把標題黨,各位知友請見諒。
歡迎大家關注公眾號:千珏(jue),後臺給我留言呀。
閱讀更多 千珏帶你學java 的文章