1. 程式人生 > 實用技巧 >Java反射機制思維導圖(全)

Java反射機制思維導圖(全)

在這裡插入圖片描述

Java反射機制思維導圖(全)

  1. 類載入器

    1. 概述
      當我們的程式在執行後,第一次使用某個類的時候,會將此類的class檔案讀取到記憶體,並將此類的所有資訊儲存到一個Class物件中,類載入器就是是負責將磁碟上的某個class檔案讀取到記憶體並生成Class的物件的。

    2. 分類
      啟動/引導 類載入器(Bootstrap ClassLoader):用於載入系統類庫
      擴充套件類載入器(Extension ClassLoader):用於載入擴充套件類庫/
      JDK9之後變成PlatformClassLoader,平臺類載入器
      應用程式類載入器(Application ClassLoader):用於載入我們自定義類的載入器

      3.雙親委派機制
      模型

      好處
      Java中類載入到記憶體是分層次的。例如:系統類庫中的類 java.lang.Object。無論哪一個類載入器要載入這個類,最終都是委派給處於頂端的"啟動類載入器"進行載入,因此 java.lang.Object類在程式的各種類載入器環境中都是同一個類。不會出現隨便定義上帝類的弊端

  2. 反射機制

    1. 概述
      反射是一種機制,利用該機制可以在程式執行過程中對類進行解剖並操作類中的所有成員(成員變數,成員方法,構造方法)
      使用場景
      開發IDE(整合開發環境),比如IDEA,Eclipse
      各種框架的設計和學習 比如Spring,Hibernate,Struct,Mybaits…
    2. 獲取Class物件
      方式1: 通過型別名.class獲得
      方式2:通過物件名.getClass()方法獲得
      方式3:通過Class類的靜態方法獲得: static Class forName(“類全名”)
      Class中的一些方法
      getName
      getSimpleName
      newInstance
      需要有可訪問的無參構造方法
    3. 反射獲取構造方法並使用
      Class獲取構造器Constructor物件
      獲取指定構造器
      1. Constructor getConstructor(Class…
      parameterTypes)
      根據引數型別獲得對應的
      只能獲得public修飾的構造方法
      2. Constructor getDeclaredConstructor(Class… parameterTypes)
      根據引數型別獲得對應的Constructor物件
      可以是public、protected、(預設)、private修飾符的構造方法
      獲取多個構造器
      3. Constructor[] getConstructors()
      獲得類中的所有構造方法物件,只能獲得public的
      4. Constructor[] getDeclaredConstructors()
      獲得類中的所有構造方法物件,可以是public、protected、(預設)、private修飾符的構造方法。
      Constructor物件常用方法
      1. T newInstance(Object… initargs)
      根據指定的引數建立物件,型別和個數,順序一定要匹配
      2. void setAccessible(true)
      設定"暴力反射"——是否取消許可權檢查,true取消許可權檢查,false表示不取消
    4. 反射獲取成員發方法並使用
      Class獲取方法Method物件
      1. Method getMethod(String name,Class…args);
      2.Method getDeclaredMethod(String name,Class…args);
      3.Method[] getMethods();
      4.Method[] getDeclaredMethods();
      使用Method
      Object invoke(Object obj, Object… args)
      obj:呼叫方法所使用的物件,如果是靜態方法可以傳入null
      args:呼叫方法時傳遞的引數
      返回值就是當前方法執行返回的結果,如果是void方法固定返回null
      void setAccessible(true)
      設定"暴力訪問"——是否取消許可權檢查,true取消許可權檢查,false表示不取消
    5. 反射獲取成員變數並使用
      Class獲取屬性Filed物件
      Field getField(String name);
      Field getDeclaredField(String name);
      Field[] getFields();
      Field[] getDeclaredFields();
      Filed常用方法
      設定值
      void set(Object obj, Object value)
      void setInt(Object obj, int i)
      void setLong(Object obj, long l)
      void setBoolean(Object obj, boolean z)
      void setDouble(Object obj, double d)
      獲取值
      Object get(Object obj)
      int getInt(Object obj)
      long getLong(Object obj)
      boolean getBoolean(Object ob)
      double getDouble(Object obj)
      void setAccessible(true);暴力反射,設定為可以直接訪問私有型別的屬性。
      Class getType(); 獲取屬性的型別,返回Class物件。