1. 程式人生 > 其它 >CSAPP(八)——異常控制流

CSAPP(八)——異常控制流

內建的註解

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);
    }

}