(分類信息來自百度搜索)
- 運行機制分類:
- 源注解 代碼中注解編譯后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 解析自定義注解鳞尔。另一篇是個綜合應用(一個可擴展的校驗注解:實現再特定業(yè)務下 校驗功能)