CSAPP(八)——異常控制流
阿新 • • 發佈:2022-05-31
內建的註解
Java 定義了一套註解,共有 7 個,3 個在 java.lang 中,剩下 4 個在 java.lang.annotation 中。
作用在程式碼的註解是
@Override - 檢查該方法是否是重寫方法。如果發現其父類,或者是引用的介面中並沒有該方法時,會報編譯錯誤。
@Deprecated - 標記過時方法。如果使用該方法,會報編譯警告。
@SuppressWarnings - 指示編譯器去忽略註解中宣告的警告。
作用在其他註解的註解(或者說 元註解)是:
@Retention - 標識這個註解怎麼儲存,是隻在程式碼中,還是編入class檔案中,或者是在執行時可以通過反射訪問。
@Documented
@Target - 標記這個註解應該是哪種 Java 成員。
@Inherited - 標記這個註解是繼承於哪個註解類(預設 註解並沒有繼承於任何子類)
從 Java 7 開始,額外添加了 3 個註解:
@SafeVarargs - Java 7 開始支援,忽略任何使用引數為泛型變數的方法或建構函式呼叫產生的警告。
@FunctionalInterface - Java 8 開始支援,標識一個匿名函式或函式式介面。
@Repeatable - Java 8 開始支援,標識某註解可以在同一個宣告上使用多次。
@Rentention
- RententionPolicy.SOURCE:Annotation資訊僅存在於編譯器處理期間,編譯器處理完之後就沒有該Annotation資訊了
- CLASS:編譯器將Annotation儲存於類對應的.class檔案中。預設行為
- RUNTIME:編譯器將Annotation儲存於class檔案中,並且可由JVM讀入,常用
@Target
指明註解可以放在什麼地方,若定義註解時沒有Target任何位置都可以用這個註解:
- ElementType.TYPE:類、介面(包括註釋型別)或列舉宣告
- ElementType.FIELD:欄位宣告(包括列舉常量)
- ElementType.METHOD:方法宣告
- ElementType.PARAMETER:引數宣告
反射使用註解
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Classname: MyAnnotation * @Description: 定義一個註釋 * @Author: Stonffe * @Date: 2022/11/30 16:46 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default "hello"; } /** * @Classname: Person * @Description: * @Author: Stonffe * @Date: 2022/11/30 16:51 */ public class Person { @MyAnnotation public void nothing(){ System.out.println("nothing"); } @MyAnnotation(value = "i wirte something here") public void something(String name,int age){ System.out.println("the age of"+name+"is"+name); } } import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { public static void main(String[] args) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { Person person = new Person(); Class<? extends Person> personClass = person.getClass(); Method nothing = personClass.getMethod("nothing", new Class[]{}); nothing.invoke(person,new Object[]{}); MyAnnotation annotation = nothing.getAnnotation(MyAnnotation.class); String value1 = annotation.value(); System.out.println(value1); Method something = personClass.getMethod("something", String.class, int.class); something.invoke(person,"yukito",18); MyAnnotation annotation1 = something.getAnnotation(MyAnnotation.class); String value2 = annotation1.value(); System.out.println(value2); } }