暑期自學 Day 08 | Junit,反射,註解(二)

Borris發表於2020-05-16
Class 物件功能獲取成員變數例項
        Class p = Person.class;

        // Field[] getFields()
        // 獲取 public 修飾的成員變數
        Field[] fs = p.getFields();
        for (Field f : fs) {
            System.out.println(f);
        }
        // Field getField(String name);
        Field f1 = p.getField("a");
        Person pe = new Person();

        f1.set(pe,"哈哈");
        System.out.println(pe);

        // Filed[] getDeclaredFields()
        // 獲取所有成員變數
        Field[] fs2 = p.getDeclaredFields();
        for (Field f : fs2) {
            System.out.println(f);
        }

        // Field getDeclaredField(String name)
        // 獲取指定成員變數
        Field f2 = p.getDeclaredField("name");
        Person pe2 = new Person();
        // 暴力反射,忽略安全檢查
        f2.setAccessible(true);
        f2.set(pe2,"名字");
        System.out.println(pe2);
Class 物件功能獲取構造方法變數例項
  • 構造器是用來建立物件的

          Class personClass = Person.class;
    
          // 構造器 (帶參) 建立物件
          Constructor constructor = personClass.getConstructor(String.class, int.class);
          System.out.println(constructor);
    
          Object person = constructor.newInstance("張三",18);
          System.out.println(person);
    
          // 構造器 (空參)建立物件
          Object o = personClass.newInstance();
          System.out.println(o);
    
          // 獲取構造器 (public)
          Constructor[] c1 = personClass.getConstructors();
          for (Constructor c : c1) {
              System.out.println(c);
          }
    
          // 獲取構造器 (帶參)
          Class[] parameterType = new Class[]{String.class, int.class};
          Constructor c = personClass.getConstructor(parameterType);
          System.out.println("Constructor of myClass: " + c);
  • 獲取 constructor 的相關方法和獲取成員變數的相關方法類似,但獲取帶參構造方法時記得傳遞所需引數陣列。

Class 物件獲取 Method 例項
        Class personClass = Person.class;

        Method eatMethod1 = personClass.getMethod("eat");
        Method eatMethod2 = personClass.getMethod("eat",String.class);

        Person p = new Person();

        // 執行方法
        eatMethod1.invoke(p);
        eatMethod2.invoke(p,"飯");
  • 透過反射,一旦所使用的物件和方法發生更改,我們只需要修改配置檔案即可,無需對程式碼進行更改。在大型專案中能夠提高效率。

註解 Annotation

  • 內建註解

    • Override: 檢測被該註解標註的方法是否繼承父類或介面
    • Deprecated:該註解標註的內容已過時
    • SuppressWarnings:壓制警告,需要傳參
  • 自定義註解

    • 格式
      • 元註解
      • public @interface 註解名稱{ 屬性列表(成員方法); }
    • 註解本質上是一個介面,預設繼承 Annotation 介面
    • 屬性:介面中可以定義的成員方法(抽象方法)
      • 返回值型別:
        • 基本資料型別
        • 字串
        • 列舉
        • 註解
        • 以上型別的陣列
    • 定義屬性後,使用時需要給屬性賦相應的值
    • 元註解:用於描述註解的註解
      • @Target() 描述註解能夠作用的位置
        • @Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FEILD}) // 作用於 成員變數,方法,類
      • @Retention() 註解能被保留的階段
        • @Retention(RetentionPolicy.RUNTIME) 或 SOURCE, CLASS
      • @Documented 描述註解是否被抽取到 API 文件
      • @Inherited 描述註解是否被繼承
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章