(分類信息來(lái)自百度搜索)
- 運(yùn)行機(jī)制分類:
- 源注解 代碼中注解編譯后class中沒有
- 編譯時(shí)注解 再class中存在的
- 運(yùn)行時(shí)注解 運(yùn)行時(shí)起作用的注解
- 按來(lái)源分
- JDK自帶注解
- 三方注解 最常見
- 自定義注解
- 元注解
- 注解的注解
今天來(lái)看看Java的自定義注解,看Java自定義注解前先看看jdk中的三個(gè)注解:@Override @Deprecated @SuppressWarnings
@Override:表示當(dāng)前類覆蓋了父類的方法。@Deprecated:當(dāng)前方法過(guò)時(shí)不再推薦使用 @SuppressWarnings:忽略警告。
回歸正題看看自定義注解:
java通過(guò)@interface 實(shí)現(xiàn)注解.來(lái)看看下面的自定義注解。
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是這個(gè)注解的作用范圍 ElementType.METHOD這個(gè)是方法級(jí)別的
* 此外還有:CONSTRUCTOR(構(gòu)造方法聲明),FIELD(字段聲明),LOCAL VARIABLE(局部變量聲明),
* METHOD(方法聲明),PACKAGE(包聲明),PARAMETER(參數(shù)聲明),TYPE(類接口)
*/
@Target(ElementType.METHOD)
/**
* @Retention是它的生命周期
* 取值:SOURCE(只在源碼顯示,編譯時(shí)丟棄),CLASS(編譯時(shí)記錄到class中,運(yùn)行時(shí)忽略),
* RUNTIME(運(yùn)行時(shí)存在,可以通過(guò)反射讀?。? */
@Retention(RetentionPolicy.RUNTIME)
public @interface ShowMessage {
/**
* value是注解的成員變量(當(dāng)只有一個(gè)成員變量時(shí)必須用value) 可以使用 default指定默認(rèn)值。
* 成員變量的類型限定必須是:基本的數(shù)據(jù)類型以及String,Class,Annotation,Enumeration
* @return
*/
String value() default "";
}
這樣就定義完一個(gè)注解了??墒嵌x完了怎么用呢?
下來(lái)提供兩種解析自定義的注解的方式:1.java 反射解析自定義注解。2.使用Spring AOP 的Aspectj 解析自定義注解。
話不多說(shuō)直接上代碼說(shuō)明都在代碼注釋里
- 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("測(cè)試信息");
}
}
我這里使用JUNIT測(cè)試解析定義注解
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");
/**
* 這里我定義的是方法級(jí)注解,這里取對(duì)應(yīng)的方法
*/
Method[] methods=c.getDeclaredMethods();
for (Method method:methods){
/**
* isAnnotationPresent() 判斷是否使用注解
* 判斷AnnotationUtile是否有ShowMessage注解
*/
Boolean ble = method.isAnnotationPresent(com.annotation.annotation.ShowMessage.class);
if (ble){
//獲取注解的實(shí)例
ShowMessage showMessage = method.getAnnotation(ShowMessage.class);
//獲取注解成員變量并打印
logger.debug(showMessage.value());
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果如下:
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
一會(huì)看世界杯了 剩下的稍后再補(bǔ)充。計(jì)劃注解再寫兩篇 一篇是Spring AOP 的Aspectj 解析自定義注解。另一篇是個(gè)綜合應(yīng)用(一個(gè)可擴(kuò)展的校驗(yàn)注解:實(shí)現(xiàn)再特定業(yè)務(wù)下 校驗(yàn)功能)