註解

註解:一種模式。1.5之後的新特性。
(1)利用cmd運行System.runFinalizeOnExit(true)
一種寫法
<c:\Document and Setting\IBM>set path=C:\java\jdk1.6.0_03\bin;%path%;
<c:\Document and Setting\IBM>cd E:\workspace3\javaenhance\src\cn\itcast\day2
<c:\Document and Setting\IBM>e:
<E:\workspace3\javaenhance\src\cn\itcast\day2>javac AnnotationTest.java
注意 AnnotationTest.java 使用或者覆蓋了已過時的API
注意 要了解詳細信息,請使用-xlint:deprecation重新編譯(這句話的意思是:javac -Xlint:deprecation AnnotationTest.java)
deprecated過時了。。。單詞不會。。
specification 規範。。。單詞不會

三個環境變量
JAVE_HOME: JDK的安裝路徑
PATH: JAVE_HOME\BIN %JAVA_HOME%(表示用JAVA_HOME的值來替換JAVA_HOME這個位置)\BIN 找可執行文件的存放地點
CLASSPATH:.
指示編譯器和JVM到哪找所需要的類
(2)用eclipse
告訴編譯器或者開發工具一個信息:你怎麼怎麼的。。。
@SupperssWarning("depretation")//壓縮警告 生命週期是在SOURCE 不要讓它過時。。。(eclipse不理我。。。cmd理我。。。)

public static void main(String[] args){
    System.runFinalizeOnExit(true);這個方法會被eclipse劃一個線
}
一個註解就是一個類。
(3)註解例子
如果我這個方法可能不用的話,我要兼容已經使用我方法的人。告訴新的人不要用這個了。
@Deprecated生命週期在RUNTIME
public static void sayHello(){}

重寫hashCode和equals時,會犯很多錯誤,比如hashCode(Object obj)可能寫出hashCode(當前的這個類 obj)造成重載
所以使用
@override生命週期在SOURCE
public int hashCode(Object obj)//對的
@override
public int hashCode(當前類 obj)//錯的
(4)註解可以加在包、類、字段、方法、方法的參數、以及局部變量上
@Target(ElementType.METHOD)或者@Target({ElementType.Type,ElementType.Method})
(5)註解的應用
三個概念:註解類、應用了註解類的類、對應用了註解類的類進行反射操作的類。
註解類
@interface A{
}
應用了註解類的類
@A
ClassB{
}
對應用了註解類的類進行反射操作的類
Class C{
}

視圖:java視圖、eclipse視圖。
main方法不一定屬於所在類的成員。比如對應用了註解類的類,是否已經應用了註解類。package test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@MyAnnotation
public class AnnotationTest {
    public static void main(String[] args)throws Exception{
        boolean temp = AnnotationTest.class.isAnnotationPresent(MyAnnotation.class);
        System.out.println(temp);
        MyAnnotation annotation = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
        System.out.println(annotation);
    }
}

//元註解(元數據、元信息在生活中常見)
@Retention(RetentionPolicy.RUNTIME)//一直要保留到運行期間:
//由於編譯器可能在在生成Class字節碼時,將註解給過濾掉了。
//由於ClassLoader會將Class文件進行處理形成真正的字節碼文件(Class文件實際上不是字節碼文件)過程中,把你的註解給弄掉了。
@interface MyAnnotation{}
//註解的生命週期:java源文件(RetentionPolicy.SOURCE)、Class文件(Retention.CLASS)、內存的字節碼文件(Retention.RUNTIME)
(6)註解的屬性
package test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@MyAnnotation(color = "red",value = "abc",arrayAttrbute = 1,annotationAttrubte=@AnnotationAttrbute("MyAnnotationAttrbute"))//只有value屬性的時候可以省略=和value變量名 但此時有color屬性就不能寫成那個樣子了
//但可以爲color 指定缺省屬性 default "green"; @MyAnnotation("abc")就可以了
//賦值數組元素的時候可以寫成以上形式。省略大括號
public class AnnotationTest {
    public static void main(String[] args)throws Exception{
        boolean temp = AnnotationTest.class.isAnnotationPresent(MyAnnotation.class);
        System.out.println(temp);
        MyAnnotation annotation = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
        System.out.println(annotation.color());
        System.out.println(annotation.value());
        System.out.println(annotation.arrayAttrbute().length);
        System.out.println(annotation.wkd());
        System.out.println(annotation.annotationAttrubte());
    }
}

//元註解(元數據、元信息在生活中常見)
@Retention(RetentionPolicy.RUNTIME)//一直要保留到運行期間:
//由於編譯器可能在在生成Class字節碼時,將註解給過濾掉了。
//由於ClassLoader會將Class文件進行處理形成真正的字節碼文件(Class文件實際上不是字節碼文件)過程中,把你的註解給弄掉了。
@interface MyAnnotation{
    public String color();
    String value();//默認public 特殊名字的屬性
    int[] arrayAttrbute() default {3,4,5};//默認值 數組屬性
    WeekDay wkd() default WeekDay.MON;//枚舉類型的
    AnnotationAttrbute annotationAttrubte() default @AnnotationAttrbute("AnnotationAttrbute");
    
}

@interface AnnotationAttrbute{
    String value();
}
//註解的生命週期:java源文件(RetentionPolicy.SOURCE)、Class文件(Retention.CLASS)、內存的字節碼文件(Retention.RUNTIME)
enum WeekDay{
    SUN,MON,TUS,WED(1);
    private WeekDay(){System.out.println("無參構造");}
    //調用第二個有參構造的方法 表示創建這個元素的時候,調用哪個構造方法。
    private WeekDay(int day){System.out.println("有參構造");}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章