小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java SE 注解(annotation)總結(jié)

 昵稱9918558 2012-05-08

首先了解一下什么是注解:

所謂的注解就是當(dāng)我們編寫代碼時,常常見到的@Override、@Deprecated、@SuppressWarnings等,可以查看幫助文檔中:java.lang.annotation接口,所有的注解都必須實現(xiàn)該接口。

接下來了解一下注解的作用:

1、  當(dāng)我們在編寫代碼時用到一些不建議使用的方法時,就會出現(xiàn)一些黃色的警告,那么這些警告是怎么產(chǎn)生的呢,這就是注解的作用。下面我們通過一個實際的例子來分析一下其情況和過程。

還是先進(jìn)行了解一下@Deprecated這個注解:

@Documented

@Retention(value=RUNTIME)

public @interface Deprecated @Deprecated 注釋的程序元素,不鼓勵程序員使用這樣的元素,通常是因為它很危險或存在更好的選擇。在使用不被贊成的程序元素或在不被贊成的代碼中執(zhí)行重寫時,編譯器會發(fā)出警告。

知道了這個注解的作用,那么我們就看一下java.util.Date這個包下的一些方法:

@Deprecated

    public int getSeconds() {

        return normalize().getSeconds();

    }

當(dāng)注解用在這個方法上時,編譯器就知道這個方法是個不建議被使用的方法,當(dāng)然如果我們用了,那么如果出現(xiàn)意外后果,也只有我們自己承擔(dān)了。那么我們在編寫代碼時,如果用到該方法,編譯器就會提醒我們不建議我們使用。

2、  了解一下@Override這個注解

表示一個方法聲明打算重寫超類中的另一個方法聲明。如果方法利用此注釋類型進(jìn)行注解但沒有重寫超類方法,則編譯器會生成一條錯誤消息。 

當(dāng)我們繼承父類的某一個方法時,可以在方法的上面添加這個注解,如果不加,也不會有什么影響,但是如果我們加了,但是我們寫的方法父類中不存在該方法,則當(dāng)我們編譯的時候,就會報錯。

…………

還有其他的注解作用自己看java幫助文檔

 

接下來,就學(xué)習(xí)一下如果寫自己的注解

注解有兩個常用的特征:

1、  注解的生命長度:即這個注解用到什么時候會被編譯器拋棄,總共有三個選項,一個注解只能為下列的一種情況。

a)        SOURCE:編譯器要丟棄的注釋。

b)       CLASS:編譯器將把注釋記錄在類文件中,但在運(yùn)行時 VM 不需要保留注釋。

c)        RUNTIME:編譯器將把注釋記錄在類文件中,在運(yùn)行時 VM 將保留注釋,因此可以反射性地讀取。

2、  注解的使用范圍:即注解是在方法上還是類上、抑或是變量上,這類注解的取值可以為多個:

a)        ANNOTATION_TYPE:注解類型聲明

b)       CONSTRUCTOR:構(gòu)造方法聲明

c)        FIELD:字段聲明(包括枚舉常量)

d)       LOCAL_VARIABLE:局部變量聲明

e)        METHOD:方法聲明

f)        PACKAGE:包聲明

g)       PARAMETER:參數(shù)聲明

h)       TYPE:類、接口(包括注釋類型)或者枚舉聲明

那么根據(jù)這些情況我們就可以寫一些自己的注解:這個示例是圣思園編程競賽中的一道題

packagedong.application.shengsiyuan;

importjava.lang.annotation.ElementType;

importjava.lang.annotation.Retention;

importjava.lang.annotation.RetentionPolicy;

importjava.lang.annotation.Target;

//這個注解是用于標(biāo)示要進(jìn)行測試的方法

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public@interface Test

{

}

下面我們使用一下這個注解:

packagedong.application.shengsiyuan;

publicclass MyClass

{

       public void method1()

       {

              System.out.println("method1");

       }

       @Test

       public void method2()

       {

              System.out.println("method2");

       }

       @Test

       public int add(int a, int b)

       {

              return a + b;

       }

       @Test

       public void doSomething(String str)

       {

              System.out.println(str);

       }

       @Test

       public void doSomething2()

       {

              System.out.println("doSomething2");

       }

       @Test

       protected void doSomething3()

       {

              System.out.println("doSomething3");

       }

       @Test

       private void doSomething4()

       {

              System.out.println("doSomething4");

       }

       @Test

       void doSomething5()

       {

              System.out.println("doSomething5");

       }

}

下面我們通過反射來獲取注解信息,然后根據(jù)注解內(nèi)容進(jìn)行相應(yīng)的操作:

packagedong.application.shengsiyuan;

importjava.lang.reflect.Method;

/**

 * 一個小型框架,用于執(zhí)行用戶的@Test注解的方法

 * 

 * @author HS

 * 

 */

publicclass ApplicationRun

{

       /**

        * 執(zhí)行用戶@Test注解的方法

        *@param className

        *           要執(zhí)行的類

        *@throws Exception

        */

       public void run(String className) throwsException

       {

              // 獲取類的Class對象

              Class<?> clazz =Class.forName(className);

              // 獲取類中的所有public方法

              Method[] methods =clazz.getMethods();

              for (Method method : methods)

              {

                     // 獲取每一個方法的@Test注解

                     Test test =method.getAnnotation(Test.class);

                     // 如果獲取的注解不為空則,進(jìn)行返回值類型判斷

                     if (test != null)

                     {

                            // 如果返回值類型為void,則進(jìn)行參數(shù)個數(shù)判斷

                            if(method.getReturnType() == void.class)

                            {

                                   // 如果參數(shù)個數(shù)為0,則執(zhí)行該方法

                                   if(method.getParameterTypes().length == 0)

                                   {

                                          method.invoke(clazz.newInstance(),new Object[]{});

                                   }

                            }

                     }

              }

       }

}

測試類:

packagedong.application.shengsiyuan;

 

publicclass TestMyClass

{

       public static void main(String[] args)

       {

              ApplicationRun app = newApplicationRun();

              try

              {

                     app.run("dong.application.shengsiyuan.MyClass");

              }

              catch (Exception e)

              {

                     e.printStackTrace();

              }

       }

}

======================================================================

這個就是傳說中的測試框架的簡易模型,注解在以后的框架學(xué)習(xí)中作用很大,當(dāng)然如果我們僅僅是框架的使用者、一個機(jī)器人,那么沒有必要學(xué)習(xí)框架,只需要按照框架的條條框框去編代碼即可。

下面通過反射去獲取注解的內(nèi)容信息:

注解的定義:

packagedong.application.annotation;

importjava.lang.annotation.Retention;

importjava.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)

public@interface FirstAnnotation

{

       //為注解的參數(shù)設(shè)置默認(rèn)值的方法就是在后面加上一個default

       //當(dāng)然也可以為數(shù)組,其類型也可以根據(jù)情況設(shè)定

       String value() default "lovexiaojing";//李曉靜是我的女朋友哦。。。嘻嘻

}

注解的使用:

packagedong.application.annotation;

@FirstAnnotation("xiaojing")

publicclass BaseAnnotationTest

{

       @FirstAnnotation("xiaojing")

       public String toString()

       {

              return "LOVE XIAOJING";

       }

       @FirstAnnotation

       public String action()

       {

              return "FOREVER";

       }

}

通過反射去獲取注解信息:

packagedong.application.annotation;

importjava.lang.annotation.Annotation;

publicclass TestMyAnnotation

{

       @SuppressWarnings("unchecked")

       public static void main(String[] args)

       {

              BaseAnnotationTest bat = newBaseAnnotationTest();

              Class<?> clazz =bat.getClass();

              FirstAnnotation f =clazz.getAnnotation(FirstAnnotation.class);

              System.out.println(f.annotationType().isAnnotation());

              System.out.println(f.value());

//            Annotation[] annotation =clazz.getAnnotations();

//            for(Annotation a : annotation)

//            {

//                   System.out.println(a.annotationType());

//                   Class<FirstAnnotation>ano = (Class<FirstAnnotation>) a.annotationType();

//                   System.out.println(ano.getName());

//            }

       }

}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多