關於反射機制(反射機制的理解一)
在還不太熟悉反射的昨天,以為反射很神祕,在網上到處找答案.今天找了段程式碼敲了一下,茅塞頓開!其實反射也就那麼簡單的一回事!
反射是一種機制,通過這種機制我們可以知道一個未知型別的型別資訊.比如,有一個物件a,這個物件不是我們定義的,也許是通過網路捕捉到的,也許是使用泛型定義的,但我們想知道這個物件的型別資訊,想知道這個物件有哪些方法或者屬性什麼的.甚至我們想進一步呼叫這個物件的方法.關鍵是現在我們只知道它是一個物件,不知道它的型別,自然不會知道它有哪些方法等資訊.這時我們該怎麼辦?反射機制就是解決這麼一個問題的.通過反射機制我們可以知道未知型別物件的型別資訊.
再比如,我們有一個dll檔案,我們想呼叫裡面的類.現在假設這個dll檔案的類的定義,數量等不是固定的,是經常變化的.也許某一天你要在這個dll裡面增加一個類定義.也許你覺得這沒什麼問題,現在關鍵是我們在另一個程式集裡面要呼叫這個dll,這是我們的程式必須能夠適應這個dll的變化,也就是說即使改變了dll檔案的定義也不需要改變我們的程式集.這時候我們就會使用一個未知dll.我們該怎麼辦?同樣,反射機制幫助了我們,我們可以通過反射來實現.
說白了,反射就是能知道我們未知型別的型別資訊這麼一個東西.沒什麼神祕可講!
今天我先講一個獲得程式集資訊的例子.
下面我們來舉一個例子.例子的思路是這樣的:我們有一個dll.該dll裡面有許多關於運動的類.每一個類記錄了一種體育運動的資訊.我們在另外一個程式裡面要知道這個dll的資訊:(如果你還不能明白我的意思,請耐心的照我的步驟把這個過程走一變!)
第一步:我們建一個檔案Sport.cs.內容如下:
using System;
public abstract class Sport
{
protected string name;
public abstract string GetDuration();
public abstract string GetName();
}
咱們用命令"csc /t:library Sport.cs"編譯它.
using System;
public class Football:Sport
{
public Football()
{
name = "Football";
}
public override string GetDuration()
{
return "four 15 minute quarters";
}
public override string GetName()
{
return name;
}
}
public class Hockey:Sport
{
public Hockey()
{
name = "Hockey";
}
public override string GetDuration()
{
return "three 20 minute periods";
}
public override string GetName()
{
return name;
}
}
public class Soccer:Sport
{
public Soccer()
{
name = "Soccer";
}
public override string GetDuration()
{
return "two 45 minute halves";
}
public override string GetName()
{
return name;
}
}
下面我們用命令"csc /t:library /r:Sport.dll SomeSports.cs"編譯該檔案.
現在我們有了我們的運動資訊dll檔案.現在我們想通過程式知道里面有哪些類.請進入最後一步:
第三步:我們建立檔案AssemblyDemo.cs".內容如下:
using System;
using System.Reflection;
public class AssemblyDemo
{
public static void Main(string[] args)
{
int i,j;
//==========================
//First the command line arguments are evaluated.if there isn't
//at least one,a usage message is printed
//=================================
if(args.GetLength(0)<1)
{
Console.WriteLine("usage is AssemblyDemo<library_name>");
}
else
{
//========================
// An Assembly object is obtained from the command line argument
//========================
Assembly assembly=Assembly.LoadFrom(args[0]);
Type[] types=assembly.GetTypes();
Console.WriteLine(assembly.GetName().Name+"contains the following types");
for(i=0;i<types.GetLength(0);++i)
{
Console.WriteLine("\r("+i+") " + types[i].Name);
}
i=types.Length - 1;
Console.Write("make selection(0-"+i+");");
j=Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
if(types[j].IsSubclassOf(typeof(Sport)))
{
ConstructorInfo ci=types[j].GetConstructor(new Type[0]);
Sport sport=(Sport)ci.Invoke(new Object[0]);
Console.WriteLine(sport.GetName() + "has" + sport.GetDuration());
}
else
{
Console.WriteLine(types[j].Name + "is not a sub-class of Sport");
}
}
}
}
}
咱們用命令"csc /r:Sport.dll AssemblyDemo.cs"編譯該檔案.
下面我們用"AssemblyDemo SomeSports.dll"執行該程式.
進一步程式要求我們輸入選項,咱們輸入1,就顯示了結果:Hockeyhasthree 20 minute periods.
(關於反射的另一層理解:
一個介面類,一個實現類,congfig配置好指向,直接通過介面呼叫方法這就是一個反射
)
相關推薦
關於反射機制(反射機制的理解一)
在還不太熟悉反射的昨天,以為反射很神祕,在網上到處找答案.今天找了段程式碼敲了一下,茅塞頓開!其實反射也就那麼簡單的一回事! 反射是一種機制,通過這種機制我們可以知道一個未知型別的型別資訊.比如,有一個物件a,這個物件不是我們定義的,也許是通過網路捕捉到的,
Golang的反射機制(The Laws of Reflection)
Introduction(簡介) 反射機制能夠在陳故鄉執行過程中檢查自身元素的結構,型別;屬於元程式程式設計。但同時也帶來了不少迷惑。 本文我們嘗試通過解釋Go中的反射機制來解釋一些使用細節。每種語言的反射機制都是不同的(有很多語言甚至沒有反射),此文針
Binder機制(非常好理解)
Binder是一種程序間通訊機制,用來實現不同程序之間的通訊。 Binder機制主要由四大塊組成,分別是客戶空間的client、server,serverManager,還有核心的Binder驅動。 下面我先看下圖,利於理解Binder內部工作機制: 伺服器端。一
這一次,徹底弄懂 JavaScript 執行機制(寫的非常好)
本文的目的就是要保證你徹底弄懂javascript的執行機制,如果讀完本文還不懂,可以揍我。 不論你是javascript新手還是老鳥,不論是面試求職,還是日常開發工作,我們經常會遇到這樣的情況:給定的幾行程式碼,我們需要知道其輸出內容和順序。因為javasc
AI 狀態機機制(虛幻三的做法)
調用 設有 mode 作用 self 信息 怪物 測試 pat 1.Nav Mesh Bounds Volume (Navigate導航,操縱)指的是可以導航(操作)的區域。 2.MVC的編程模式:(Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。 通
操作系統運行環境與運行機制(系統調用篇)
str 決定 efi 中斷處理程序 ima char () ext 使用 系統調用: 用戶在編程是可以調用的操作系統功能(使CPU可以從用戶態陷入內核態) 應用程序,C函數,API,和內核函數關系 系統調用機制的設計 ①中斷/異常機制 支持系統調用服務的實現
mongodb副本集的內部機制(借鑒lanceyan.com)
proc 導致 功能 來看 href 開始 既然 不想 for 針對mongodb的內部機制提出以下幾個引導性的問題: 副本集故障轉移,主節點是如何選舉的?能否手動幹涉下架某一臺主節點。 官方說副本集數量最好是奇數,為什麽? mongodb副本集是如何同步的?如果同步不及
ZooKeeper Watcher監聽機制(資料變更的通知)(二)(分析)
緊接著上一篇部落格:https://blog.csdn.net/Dongguabai/article/details/82970852 在輸出內容中有這樣兩個結果: 在ZooKeeper中,介面類Watcher用於表示一個標準的事件處理器,其定義了事件通知相關的邏輯,包含Ke
《深入理解Java虛擬機器》讀書筆記(JVM常識彙總一)
0:JVM的記憶體佈局: (這裡用百度到的圖) 這應該是比較經典的一個JVM記憶體佈局圖。 如圖上:堆和方法區是被執行緒共享的,虛擬機器棧,本地方法棧,程式計數器,這是每個執行緒私有的,即每個執行緒都有1份。 【1】堆:絕大多數物件都存放在這裡,當然肯定有的物件活的久,壽命長,
QOS-基本擁塞管理機制(PQ CQ WFQ RTPQ)
擁塞:是指當前供給資源相對於正常轉發處理需要資源的不足,從而導致服務質量下降的一種現象 擁塞管理概述: 需要傳送的資料流量大於裝置傳送介面的傳送能力時,會產生擁塞。 擁塞管理是指在網路發生擁塞時,進行管理和控制,合理分配資源。通常採用佇列技術實現 報文按一定的策略快取到佇列中,然後按一
ASP.NET MVC Filter過濾機制(過濾器、攔截器)
在MVC中有一個過濾機制,可以編寫為過濾器或攔截器,用於對在某個Action執行前後再執行的動作。 過濾器繼承自ActionFilterAttribute類(名稱空間是System.Web.Mvc) ActionFilterAttribute類是一個特性類。
spring的核心機制(spring的工作原理)
spring的核心機制有兩點(個人理解,如有錯誤,歡迎各位大神糾正告訴我):1.IOC:控制反轉物件,程式本身不會建立或維護物件,而是把它交給spring去管理和維護。依賴注入和控制反轉含義相同,當某個Java例項需要另外一個java例項時,傳統的方法是由呼叫者來建立被呼叫者
小程式的事件機制(冒泡與非冒泡)
WXML的冒泡事件列表: 冒泡事件:點選子節點子節點和父節點都會被執行 注:除上表之外的其他元件自定義事件如無特殊宣告都是非冒泡事件,如<form/>的submit事件,<input/>的input事件,<scroll-view/>
Spring Boot 2.4.0正式釋出,全新的配置檔案載入機制(不向下相容)
> 千里之行,始於足下。關注公眾號【**BAT的烏托邦**】,有Spring技術棧、MyBatis、JVM、中介軟體等小而美的**原創專欄**供以免費學習。分享、成長,拒絕淺嘗輒止。本文已被 [**https://www.yourbatman.cn**](https://www.yourbatman.cn)
圖解Janusgraph系列-併發安全:鎖機制(本地鎖+分散式鎖)分析
# 圖解Janusgraph系列-併發安全:鎖機制(本地鎖+分散式鎖)分析 大家好,我是`洋仔`,JanusGraph圖解系列文章,`實時更新`~ #### 圖資料庫文章總目錄: * **整理所有圖相關文章,請移步(超鏈):**[圖資料庫系列-文章總目錄 ](https://liyangyang.b
某雲數據中心網絡解決方案(分享二十一)
協議 系統 統一 數據流 http 客戶端 病毒 快速 查詢 1. 整體網絡方案 全球IDC數據中心的網絡結構符合層次化和模塊化的設計原則,分為核心層、匯聚層和接入層,其網絡拓撲圖如下圖所示: IDC機房網絡拓撲圖 方案說明: 支持接入中國移動、中國電信、中國聯
Java學習筆記44(多線程一)
fix system function 學習筆記 void dex 面向 特點 pub 多線程的概念:略 多線程的目的:提高效率 主線程: package demo; //主線程 public class Demo { public static void m
Java學習筆記48(DBUtils工具類一)
lex time name span 載器 .sql 定義 ride oot 上一篇的例子可以明顯看出,在增刪改查的時候,很多的代碼都是重復的, 那麽,是否可以將增刪改查封裝成一個類,方便使用者 package demo; /* * 實現JDBC的工具類 *
《MySQL DBA修煉之道》 讀書筆記(第一章 理解MySQL)
l數據庫 描述 負責 mysql權限 serve 擴展 基礎上 title 語境 1、MySQL的基礎架構 1.MySQL是一種關系數據庫產品,是建立在關系模型基礎上的數據庫。架構一般可分為應用層、邏輯層、物理層。應用層:負責和客戶端、用戶進行交互。邏輯層:負責具體的
(項目實戰一)響應式導航
源碼 資訊 AC 大屏幕 targe eight data- container 首頁 源碼如下: <%-- Created by IntelliJ IDEA. User: shyroke Date: 2018/6/13 0013 Time: 1