1. 程式人生 > >關於反射機制(反射機制的理解一)

關於反射機制(反射機制的理解一)

   在還不太熟悉反射的昨天,以為反射很神祕,在網上到處找答案.今天找了段程式碼敲了一下,茅塞頓開!其實反射也就那麼簡單的一回事!
    反射是一種機制,通過這種機制我們可以知道一個未知型別的型別資訊.比如,有一個物件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"編譯它.

  第二步,我們再建一個名為SomeSports.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學習筆記48DBUtils工具類

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