<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                本文轉載自[秒懂,Java 注解 (Annotation)你可以這樣學](https://blog.csdn.net/briblue/article/details/73824058),內容有刪改。 注解可以理解為標簽,是對代碼貼上的標簽。 # 注解語法 ## 注解的定義 注解通過關鍵字`@interface`定義。 ```java public @interface TestAnnotation { } ``` ## 注解的應用 ```java @TestAnnotation public class Test{ } ``` ## 元注解 元注解是可以注解到注解上的注解,能夠應用到其他注解上面。元注解也是標簽,是一張特殊的標簽,作用是給其他普通標簽進行解釋說明的。 元注解有@Retention、@Documented、@Target、@Inherited、@Repeatable共5種。 ### @Retention @Retention解釋說明了這個注解的存活時間,取值有: * RetentionPolicy.SOURCE 注解只在源碼階段保留,在編譯器編譯時將會被丟棄忽視 * RetentionPolicy.CLASS 注解只被保留到編譯進行時,不會被加載到JVM中 * RetentionPolicy.RUNTIME 注解可以保留到程序運行時,會被加載到JVM中,在程序運行時可以獲取到該注解 ```java @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation { } ``` 上面代碼中,指定TestAnnotation可以在程序運行時獲取到,它的生命周期很長。 ### @Documented @Documented的作用是能夠將注解中的元素包含到Javadoc中 ### @Target @Target指定了注解運用的地方,也就是該注解的使用場景被限制了,取值有: * ElementType.ANNOTATION_TYPE 可以給一個注解進行注解 * ElementType.CONSTRUCTOR可以給構造方法進行注解 * ElementType.FIELD可以給屬性進行注解 * ElementType.LOCAL_VARIABLE可以給局部變量進行注解 * ElementType.METHOD可以給方法進行注解 * ElementType.PACKAGE可以給一個包進行注解 * ElementType.PARAMETER可以給一個方法內的參數進行注解 * ElementType.TYPE可以給一個類型進行注解,比如類、接口、枚舉 ### @Inherited 如果一個父類被一個@Inherited注解過的注解進行注解的話,它的子類沒有被任何注解應用的話,這個子類就繼承了超類的注解: ```java @Inherited @Retention(RetentionPolicy.RUNTIME) @interface Test {} @Test public class A {} public class B extends A {} ``` 此時B也擁有@Test這個注解。 ### @Repeatable @Repeatable的作用是標明一個注解可以被多次應用,也就是可以多次取值: ```java @interface Persons { Person[] value(); } @Repeatable(Persons.class) @interface Person{ String role default ""; } @Person(role="artist") @Person(role="coder") @Person(role="PM") public class SuperMan{ } ``` 可以理解為,Persons 是一張總的標簽,上面貼滿了 Person 這種同類型但內容不一樣的標簽。把 Persons 給一個 SuperMan 貼上,相當于同時給他貼了程序員、產品經理、畫家的標簽。 ## 注解的屬性 注解的屬性也叫成員變量,注解只有成員變量,沒有成員方法。注解的成員變量以“無形參的方法”的形式來聲明,方法名定義了該成員變量的名字,返回值定義了該成員變量的類型。注解中定義屬性時它的類型必須是 8 種基本數據類型外加 類、接口、注解及它們的數組。 ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation { int id(); String msg(); } ``` @TestAnnotation注解中擁有id和msg兩個屬性,使用的時候,應該給他們進行賦值。 ```java @TestAnnotation(id = 3, msg = "hello annotation") public class Test {} ``` 注解屬性的默認值需要使用default關鍵字進行指定: ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation { public int id() default -1; public String msg() default "Hi"; } ``` 當只有一個屬性時,可以簡寫如下: ```java @TestAnnotation(3) public class Test {} ``` 當沒有屬性時,可以簡寫如下: ```java @TestAnnotation public class Test {} ``` # Java中預置的注解 1、@Deprecated注解用來標記過時的方法、類、成員變量等,編譯器在編譯階段遇到這個注解時會發出提醒警告。 2、@Override注解標記子類中的方法是復寫的父類的,可以讓編譯器幫我們檢查方法重寫是否成功。 3、@SuppressWarnings注解標記阻止編譯器進行警告 4、@SafeVarargs是參數安全類型注解,它的目的是提醒開發者不要用參數做一些不安全的操作。 # 注解的提取 注解的提取可以理解為將注解標簽在合適的時候撕下來,檢閱上面的信息。注解的提取需要通過反射獲得。 1、通過Class對象的isAnnotationPresent方法來判斷是否應用了注解: ```java public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {} ``` 2、然后通過getAnnotation方法或getAnnotations方法來獲取注解: ```java public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {} public Annotation[] getAnnotations() {} ``` 如果獲取到的 Annotation 如果不為 null,則就可以調用它們的屬性方法了。比如: ```java @TestAnnotation() public class Test { public static void main(String[] args) { boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class); if ( hasAnnotation ) { TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class); System.out.println("id:"+testAnnotation.id()); System.out.println("msg:"+testAnnotation.msg()); } } } ``` 除了獲取類上的注解,同樣可以通過反射獲取成員變量、成員方法上的注解,示例如下: ```java @TestAnnotation(msg="hello") public class Test { @Check(value="hi") int a; @Perform public void testMethod(){} @SuppressWarnings("deprecation") public void test1(){ Hero hero = new Hero(); hero.say(); hero.speak(); } public static void main(String[] args) { boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class); if ( hasAnnotation ) { TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class); //獲取類的注解 System.out.println("id:"+testAnnotation.id()); System.out.println("msg:"+testAnnotation.msg()); } try { Field a = Test.class.getDeclaredField("a"); a.setAccessible(true); //獲取一個成員變量上的注解 Check check = a.getAnnotation(Check.class); if ( check != null ) { System.out.println("check value:"+check.value()); } Method testMethod = Test.class.getDeclaredMethod("testMethod"); if ( testMethod != null ) { // 獲取方法中的注解 Annotation[] ans = testMethod.getAnnotations(); for( int i = 0;i < ans.length;i++) { System.out.println("method testMethod annotation:"+ans[i].annotationType().getSimpleName()); } } } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println(e.getMessage()); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println(e.getMessage()); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println(e.getMessage()); } } } ``` 需要注意的是,如果一個注解要在運行時被成功提取,那么 @Retention(RetentionPolicy.RUNTIME) 是必須的。 # 注解使用場景 注解的用處有: * 提供信息給編譯器:編譯器可以利用注解來探測錯誤和警告信息 * 編譯時的處理:軟件工具可以利用注解信息來生成代碼、Html文檔或其他處理 * 運行時的處理:可以在程序運行時接受提取 當開發者使用了Annotation 修飾了類、方法、Field 等成員之后,這些 Annotation 不會自己生效,必須由開發者提供相應的代碼來提取并處理 Annotation 信息。這些處理提取和處理 Annotation 的代碼統稱為 APT(Annotation Processing Tool)。 本文轉載自[秒懂,Java 注解 (Annotation)你可以這樣學](https://blog.csdn.net/briblue/article/details/73824058),內容有刪改。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看