java基礎(chǔ)之-自定義注解一

(分類信息來(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ō)明都在代碼注釋里

  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("測(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)功能)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容