首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 反射機制深度解析:從 Class 對象到動態代理實戰

     編輯:Java 相關知識

什麼是反射?

在運行狀態下,獲取類的屬性、方法並修改運行行為的過程。核心 API 位於 java.lang 和 java.lang.reflect 包。

核心類:java.lang.Class

提供訪問運行時類元數據、檢查和修改運行行為的方法。

常用方法

方法說明
getName()獲取全限定類名
forName(String)靜態加載類,返回 Class 對象
newInstance()創建實例(調用無參構造器)
isInterface()判斷是否為接口
isArray()判斷是否為數組
isPrimitive()判斷是否為基本類型
getSuperclass()獲取父類 Class 引用
getDeclaredFields()獲取所有聲明字段(含私有)
getDeclaredMethods()獲取所有聲明方法
getDeclaredConstructors()獲取所有聲明構造器
getDeclaredMethod(name, params)獲取指定參數類型的方法

三種獲取 Class 對象的方式

  1. Class.forName("全限定名"):運行時動態加載,執行靜態初始化。
  2. 對象.getClass():編譯期已知類型。
  3. 類名.class:編譯期已知,適用於基本類型(如 int.class)。

代碼示例:動態創建實例

方式一:Class.newInstance()(僅無參構造器)

Class<?> c = Class.forName("tmp.Simple");
Simple s = (Simple) c.newInstance();
s.message(); // 輸出 Hello Java

方式二:Constructor.newInstance()(支持有參、破壞單例、可訪問私有)

Constructor<?> con = c.getDeclaredConstructor(String.class);
con.setAccessible(true); // 破壞封裝
Simple s = (Simple) con.newInstance("參數");

反射調用方法


Method m = c.getDeclaredMethod("cube", int.class);
m.setAccessible(true);
m.invoke(obj, 4); // 調用私有方法

javap 反編譯工具

查看字節碼結構:


javap -c Test  // 顯示方法字節碼
javap java.lang.Object  // 顯示類公共 API
javap 使用說明 javap Object 輸出 javap -c Test 輸出

參考資料

Java Reflection Tutorial

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved