Java註解技術

引言

    spring發展至今,已經從xml到註解加xml,到現在springboot主導的環境,像是一部擯棄xml轉註解的史書。java5推出的註解可謂在各類開源框架大放異彩,發揮着重要的做用。有時候在實際項目中,有一些需求能夠經過註解的方式靈活的進行配置等,就會本身寫一個註解。根據註解參數的個數,咱們能夠將註解分爲:標記註解、單值註解、完整註解三類。本文就打算寫一個小小的註解demo,進入註解世界的大門。java

元註解

    元註解的做用就是負責註解其餘的註解。java5.0定義了4個標準的meta-annotation類型,它們被用來提供對其餘annotation類型做說明,4個元註解是:spring

@Target

    主要做用 是用於描述註解的使用範圍,即被描述的註解能夠用在什麼地方:數組

    construction構造器,Field成員變量,Local_Variable局部變量,method成員方法,package包,parameter參數,type類 接口 枚舉類springboot

@Retention

    主要表示須要在什麼級別保存該註釋信息,用於描述註解生命週期:框架

    runtime運行時有效 source源文件中有效 class編譯文件中有效函數

@Documented

    用於描述其餘類型的annotation應該被做爲被標註的程序成員的公共API,是一個標記註解工具

@Inherited

    是一個標記註解,闡述了某個被標註的類型是被繼承的。若是使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將用於該classspa

自定義註解

   定義註解

    分爲兩步:經過@Interface關鍵字聲明註解名稱、註解成員屬性等; 使用Java內置四個元註解對自定義標註的功能和範圍進行約束。.net

    自定義註解的格式 public @interface 註解名{定義提},註解參數支持全部基本數據類型,String,Class類型,Enum類型。Annotation類型,以上全部類型的數組。下面自定義一個叫Tt的註解:代理

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Tt {
    String value() default "";
}

    Tt註解能夠註解在方法上,若是想註解在多個地方,能夠在Target註解屬性內加一個數組,相似於@Target({ElementType.METHOD,ElementType.TYPE}) ,同時定義了註解是在運行時被使用(通常都是這樣使用,固然好比lombok這種工具實際上是在編譯時期註解生效的,有興趣能夠看下lombok的源碼)。

    註解處理

    若是沒有註解處理的話,註解和註釋同樣,是沒有做用的,因此咱們須要對有註解的方法進行一些業務處理,咱們在main函數啓動的時候,在有tt註解的方法進行先後增長處理業務,完整代碼以下:

public class DefineAnnotationTest {

    @Test
    public void testAnnotation() throws InvocationTargetException, IllegalAccessException {
        DefineAnnotationTest d = new DefineAnnotationTest();
        Method[] methods = DefineAnnotationTest.class.getMethods();
        
        for (Method m : methods) {
            if (m.isAnnotationPresent(Tt.class)){
                String value = m.getAnnotation(Tt.class).value();
                System.out.println("被Tt註解的  前置邏輯寫在這裏 ,註解參數值是 = " + value);
                m.invoke(d,new Object[]{});
                System.out.println("被Tt註解的  後置邏輯寫在這裏 ,註解參數值是 = " + value);
            }
        }
    }

    @Tt(value = "6666")
    public void runWithTemplate() {
        System.out.println("個人先後面 幫我包裝下。相似於模板模式 或者 代理模式");
    }

    @Tt(value = "最弦民族風")
    public void trytrytry(){
        System.out.println("我就是來試試的");
    }
}

    這段代碼的運行結果:

被Tt註解的  前置邏輯寫在這裏 ,註解參數值是 = 6666
個人先後面 幫我包裝下。相似於模板模式 或者 代理模式
被Tt註解的  後置邏輯寫在這裏 ,註解參數值是 = 6666
被Tt註解的  前置邏輯寫在這裏 ,註解參數值是 = 最弦民族風
我就是來試試的
被Tt註解的  後置邏輯寫在這裏 ,註解參數值是 = 最弦民族風

Process finished with exit code 0

  看上去,咱們的註解已經成功的起到了做用。     

相關文章
相關標籤/搜索