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

如何透過反射呼叫 .NET 非公用方法:實戰範例解密 Page.DecryptString

     編輯:關於.NET

前言

.NET Framework 內部許多實用方法標記為 internal 或 private,無法直接呼叫。透過反射搭配 BindingFlags 可繞過可見性限制。本文實戰示範呼叫 Page.DecryptString 解密 __PREVIOUSPAGE 隱藏欄位,驗證跨頁回傳邏輯分析。

核心程式碼

protected void Button2_Click(object sender, EventArgs e)
{
    // 目標型別
    Type t = typeof(System.Web.UI.Page);
    
    // 參數陣列:加密字串
    object[] args = new object[] { "Htr9cH0-sPEsru8HSXo70y6PnBg8nwjl0" };
    
    // 綁定旗標:非公用、靜態/實例、宣告於此型別、呼叫方法
    BindingFlags flags = BindingFlags.DeclaredOnly 
                       | BindingFlags.Static 
                       | BindingFlags.NonPublic 
                       | BindingFlags.InvokeMethod 
                       | BindingFlags.Instance;
    
    // 呼叫內部靜態方法 DecryptString
    string decrypted = (string)t.InvokeMember("DecryptString", flags, null, this, args);
    
    Response.Write("<br/>" + decrypted + "<br/>");
}

BindingFlags 詳細解析

旗標作用
NonPublic包含非公用成員(private/protected/internal)
Static / Instance指定靜態或實例成員(此處兩者皆設,涵蓋所有)
DeclaredOnly僅搜尋型別直接宣告的成員,不含繼承鏈
InvokeMethod指定動作為呼叫方法

InvokeMember 參數:方法名、綁定旗標、Binder(null 用預設)、目標物件(靜態方法傳 null 或型別實例)、參數陣列。

應用場景與風險

  • 除錯/診斷:檢視內部狀態、驗證框架行為。
  • 相容性風險:內部方法非公用契約,版本升級可能變更簽章或移除,嚴禁用於生產環境業務邏輯。
  • 效能:反射呼叫比直接呼叫慢數量級,需快取 MethodInfo 重複使用。

進階:快取 MethodInfo 提升效能

private static readonly MethodInfo _decryptMethod = 
    typeof(Page).GetMethod("DecryptString", 
        BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

public static string DecryptViewState(string encrypted)
{
    return (string)_decryptMethod.Invoke(null, new object[] { encrypted });
}

結語

反射呼叫非公用方法是「核子選項」,威力大但風險高。適用於除錯、測試、框架擴充等非核心業務場景。生產代碼應優先尋找公用 API 替代方案,或封裝為可替換的適配器隔離變更風險。

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