詳解java1.5新添特性------註解

詳解java1.5新添特性------註解java

  在求職面試過程當中,被問到是否本身用過java註解以及本身實現過一個註解,當時就懵逼了,what's the f**k!
面試

    將來的開發模式都是基於註解的,JPA是基於註解的,Spring2.5以上都是基於註解的,Hibernate3.x之後也是基於註解的,如今的Struts2有一部分也是基於註解的了,註解是一種趨勢數組

    廢話不說直接實驗開動起來:註解就是一個特殊的類,註解向開發工具或者編譯器傳遞一種信息(官方的語言)ide

java中常見的註解工具

1.     @Override,子類覆寫父類的方法;開發工具

2.     @SuppressWarnings(「deprecation」),壓縮警告,忽略過期的警告;測試

3.     @Deprecated,方法過期;spa


package com.banyoukang.annotation;orm

    public class Test1 {對象

                public static void testSuppressWarn(){

                    System.runFinalizersOnExit(true);

                }

               @SuppressWarnings("deprecation")

                public static void testSuppressWarn2(){

                    System.runFinalizersOnExit(true);

                }

                @Override

                public String toString(){

                    return "banyoukang";

                }

                @Deprecated

                public static String testDeprecated(){

                    return "此註解說明這個方法已經廢棄,或者過期了!";

                }

            public static void main(String[] args){

                testDeprecated();//這裏使用testDeprecated方法就會顯示這個方法已通過時

            }               

    /*

     * testSuppressWarn()方法和testSuppressWarn2()對比就能夠發現,沒有註解@SuppressWarnings("deprecation")

     * 的方法中使用了java過期的runFinalizersOnExit(boolean)方法,編譯器會產生警告信息,而添加了註解的方法編譯器則      *沒有警告信息產生(便是註解的做用所在)

     */

}

經過上面的例子能夠大體的看到註解的做用所在,接下來咱們本身實現一個註解,並提取相應的信息:

註解類

package com.banyoukang.annotation;


import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;


@Target({ElementType.METHOD,ElementType.TYPE})

/*

 * Retention註解決定MyAnnotation註解的生命週期

   1.RetentionPolicy.SOURCE —— 這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略

   2.RetentionPolicy.CLASS —— 這種類型的Annotations編譯時被保留,在class文件中存在,但JVM將會忽略

   3.RetentionPolicy.RUNTIME —— 這種類型的Annotations將被JVM保留,因此他們能在運行時被JVM或其餘使用反射機制的代碼所讀取和使用.

 */

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {

    //定義註解的屬性

    String name();

    int age();

    boolean gender();

        //boolean gender() default true;這裏能夠爲屬性指定默認值,若是不指定的話,必定要傳入

        //若是一個註解中有一個名稱爲value的屬性,且你只想設置value屬性(即其餘屬性都採用默認值或者你只有一個value屬性),那麼能夠省略掉「value=」部分。

        //String value();

      //這裏也能夠定義高級屬性,好比數組和枚舉類型

}

測試類:

package com.banyoukang.annotation;


@MyAnnotation(name="班友康",age=20,gender=true)

public class MyAnnotationTest {

    public static void main(String[] args) {

//經過反射得到註解對應的實例對象,而後調用屬性

        MyAnnotation annotation = MyAnnotationTest.class.getAnnotation(MyAnnotation.class);

        if(annotation.gender()){

            System.out.println("姓名:"+annotation.name()+",年齡:"+annotation.age()+",性別:男");

        }else{

            System.out.println("姓名:"+annotation.name()+",年齡:"+annotation.age()+",性別:女");

            }

        }

    }

能夠看到註解更像是一種特殊的接口,註解的屬性定義方式就和接口中定義方法的方式同樣,而應用了註解的類能夠認爲是實現了這個特殊的接口

注:建議將代碼複製過去本身運行一次看看,會對註解有比較好的認識。

相關文章
相關標籤/搜索