【Java 基礎】15 Java 反射機制
阿新 • • 發佈:2018-12-14
反射
為什麼使用反射
需求:我公司定義了一組介面,然後第三方公司按照我公司的介面 實現了一套功能,然後交給我們,但是我們公司的專案已經結束,如何實現動態載入第三方公司提供的功能。
什麼是反射
反射就是把 Java 類中的各種成分對映成一個個的 Java 物件。例如,一個類有:成員變數,方法,構造方法,包等等資訊,利用反射技術可以對一個類進行解剖,把各個組成部分對映成一個個物件。
反射常用類
- Class 類 - 可獲取類和類的成員資訊
- Fileld類 - 可訪問類的屬性
- Method類 - 可呼叫類的方法
- Constructor類 - 可呼叫類的構造方法
使用反射的基本步驟
- 匯入 java.lang.reflect.*;
- 獲得需要操作的類的 java.lang.Class 物件
- 呼叫 Class 的方法獲取 Field、Method 等物件
- 使用反射 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});