1. 程式人生 > >java基礎之-自定義註解一

java基礎之-自定義註解一

(分類資訊來自百度搜索)

  • 執行機制分類:
    • 源註解 程式碼中註解編譯後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 解析自定義註解。 話不多說直接上程式碼說明都在程式碼註釋裡

  1. 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 解析自定義註解。另一篇是個綜合應用(一個可擴充套件的校驗註解:實現再特定業務下 校驗功能)