1. 程式人生 > >【Java 基礎】15 Java 反射機制

【Java 基礎】15 Java 反射機制

反射

為什麼使用反射

需求:我公司定義了一組介面,然後第三方公司按照我公司的介面 實現了一套功能,然後交給我們,但是我們公司的專案已經結束,如何實現動態載入第三方公司提供的功能。

什麼是反射

反射就是把 Java 類中的各種成分對映成一個個的 Java 物件。例如,一個類有:成員變數,方法,構造方法,包等等資訊,利用反射技術可以對一個類進行解剖,把各個組成部分對映成一個個物件。

反射常用類

  • Class 類 - 可獲取類和類的成員資訊
  • Fileld類 - 可訪問類的屬性
  • Method類 - 可呼叫類的方法
  • Constructor類 - 可呼叫類的構造方法

使用反射的基本步驟

  1. 匯入 java.lang.reflect.*;
  2. 獲得需要操作的類的 java.lang.Class 物件
  3. 呼叫 Class 的方法獲取 Field、Method 等物件
  4. 使用反射 API 進行操作(設定屬性、呼叫方法)

Class 類

Class 類是反射機制的起源和入口

  • 每個類都有自己的 Class 物件
  • 用於獲取與類相關的各種資訊
  • 提供了獲取類資訊的相關資訊
  • Class 類繼承自 Object 類

Class 類存放的介面資訊

  • 類名
  • 父類、介面
  • 方法、構造方法、屬性
  • 註釋

獲取 Class 物件的方法

第一種方式

// 方法 1 :物件.getClass()
Student stu = new Student();
Class clazz = stu.getClass();

第二種方式

// 方法 2 :類.class
clazz = Student.class;
clazz = String.class;

第三種方式

// 方法 3 :Class.forName()
clazz = Class.forName("java.lang.string");
clazz = Class.forName("java.util.Date");

獲取類的其他結構資訊

Class clazz = Class.forName("java.lang.object");
Field fields[] = clazz.getDeclaredFields(); // 獲取 Field 物件
Method methods[] = clazz.getDeclaredMethod(); // 獲取 Method 物件
Constructor constructors[] = clazz.getDeclaredConstrutors(); // 獲取 Constructor 物件

動態建立物件

方法一 :使用 Class 的 newInstance() 方法,僅適用無參構造方法

Class clazz = Class.forName("com.yyh.pojo.Student");
Object object = clazz.newInstance();

方法二:呼叫 Constructor 的 newInstance() 方法,適用所有構造方法

Constructor cons = clazz.getConstructor(new Class[]{String.class, Integer.class, Float.class});
Object obj = cons.newInstance(new Object[] {"lkl", 32, 56, 5f});