java基礎之-自定義註解一
阿新 • • 發佈:2018-12-21
(分類資訊來自百度搜索)
- 執行機制分類:
- 源註解 程式碼中註解編譯後class中沒有
- 編譯時註解 再class中存在的
- 執行時註解 執行時起作用的註解
- 按來源分
- JDK自帶註解
- 三方註解 最常見
- 自定義註解
- 元註解
- 註解的註解
今天來看看Java的自定義註解,看Java自定義註解前先看看jdk中的三個註解:@Override @Deprecated @SuppressWarnings @Override:表示當前類覆蓋了父類的方法。@Deprecated:當前方法過時不再推薦使用 @SuppressWarnings:忽略警告。 迴歸正題看看自定義註解: java通過@interface 實現註解.來看看下面的自定義註解。
package com.annotation.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Target是這個註解的作用範圍 ElementType.METHOD這個是方法級別的
* 此外還有:CONSTRUCTOR(構造方法宣告),FIELD(欄位宣告),LOCAL VARIABLE(區域性變數宣告),
* METHOD(方法宣告),PACKAGE(包宣告),PARAMETER(引數宣告),TYPE(類介面)
*/
@Target(ElementType.METHOD)
/**
* @Retention是它的生命週期
* 取值:SOURCE(只在原始碼顯示,編譯時丟棄),CLASS(編譯時記錄到class中,執行時忽略),
* RUNTIME(執行時存在,可以通過反射讀取)
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface ShowMessage {
/**
* value是註解的成員變數(當只有一個成員變數時必須用value) 可以使用 default指定預設值。
* 成員變數的型別限定必須是:基本的資料型別以及String,Class,Annotation,Enumeration
* @return
*/
String value() default "";
}
這樣就定義完一個註解了。可是定義完了怎麼用呢? 下來提供兩種解析自定義的註解的方式:1.java 反射解析自定義註解。2.使用Spring AOP 的Aspectj 解析自定義註解。 話不多說直接上程式碼說明都在程式碼註釋裡
- java 反射解析自定義註解
package com.annotation.impl;
import com.annotation.annotation.ShowMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AnnotationUtile {
private static Logger logger= LoggerFactory.getLogger(AnnotationUtile.class);
//使用上面自定義的註解
@ShowMessage("this is test")
private void test(){
logger.debug("測試資訊");
}
}
我這裡使用JUNIT測試解析定義註解
package com.annotation.impl;
import com.annotation.annotation.ShowMessage;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
public class TestMain {
private static Logger logger= LoggerFactory.getLogger(TestMain.class);
@Test
public void annotation(){
try {
//反射獲取使用註解的類
Class c = Class.forName("com.annotation.impl.AnnotationUtile");
/**
* 這裡我定義的是方法級註解,這裡取對應的方法
*/
Method[] methods=c.getDeclaredMethods();
for (Method method:methods){
/**
* isAnnotationPresent() 判斷是否使用註解
* 判斷AnnotationUtile是否有ShowMessage註解
*/
Boolean ble = method.isAnnotationPresent(com.annotation.annotation.ShowMessage.class);
if (ble){
//獲取註解的例項
ShowMessage showMessage = method.getAnnotation(ShowMessage.class);
//獲取註解成員變數並列印
logger.debug(showMessage.value());
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
執行結果如下:
Connected to the target VM, address: '127.0.0.1:60534', transport: 'socket'
19:02:21.837 [main] DEBUG com.annotation.impl.TestMain - this is test
Disconnected from the target VM, address: '127.0.0.1:60534', transport: 'socket'
Process finished with exit code 0
一會看世界盃了 剩下的稍後再補充。計劃註解再寫兩篇 一篇是Spring AOP 的Aspectj 解析自定義註解。另一篇是個綜合應用(一個可擴充套件的校驗註解:實現再特定業務下 校驗功能)