自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

談?wù)劤绦蚣虞d和反射機制

開發(fā) 后端
最近一直都在看關(guān)于程序集加載和反射方面的資料, 所以在這里把我所學習到的東西記錄下來,方便自己以后復習,也給不懂的朋友參考。

一、程序集的加載

JIT編譯器器將IL代碼編譯成本地代碼時, 會查看IL代碼中引用了哪些類型。在運行過程中,JIT編譯器利用程序集的TypeRef和AssemblyRef元數(shù)據(jù)表來確定哪一個程序集定義了所引用的類型,然后JIT編譯器將對應(yīng)程序集加載到AppDomain中,在內(nèi)部,CLR使用System.Reflection.Assembly類的靜態(tài)方法Load來嘗試加載一個程序集。然而如果我們想動態(tài)加載一個程序集時,可以使用Assembly的Load方法來動態(tài)加載程序集,其中Assembly類中還提供了其他的加載程序集方法,有LoadFrom(string path), LoadFile(stringassemblyFile)等,具體方法的使用和解釋可以參照MSDN中的介紹:http://msdn.microsoft.com/zh-cn/library/xbe1wdx9

二、反射機制

.net中反射在運行中過程中解析程序集中的元數(shù)據(jù),獲得類型中的成員(包括字段、構(gòu)造器、方法、屬性、事件等)信息。

動態(tài)加載一個程序集并獲得類型中的成員

把下面的類放在一個類庫工程中,并編譯生成程序集(例如為ClassLibrary1.dll,假設(shè)把dll放在D盤根目錄下面)

  1. public class ReflectTestClass 
  2.    { 
  3.       public  string name; 
  4.       public int age; 
  5.       public string Name 
  6.       { 
  7.           get { return name; } 
  8.           set { name = value; } 
  9.       } 
  10.  
  11.       public int Age 
  12.       { 
  13.           get { return age; } 
  14.           set { age = value; } 
  15.       } 
  16.  
  17.        /// <summary> 
  18.        /// No Paramter Constructor 
  19.        /// </summary> 
  20.       public ReflectTestClass() 
  21.       {  
  22.       } 
  23.  
  24.        /// <summary> 
  25.        /// Constructor with Parameter 
  26.        /// </summary> 
  27.        /// <param name="name"></param> 
  28.        /// <param name="age"></param> 
  29.        public ReflectTestClass(string names,int ages) 
  30.        { 
  31.            this.name = names; 
  32.            this.age = ages; 
  33.        } 
  34.  
  35.        public string writeString(string name) 
  36.        { 
  37.            return "Welcome " + name; 
  38.        } 
  39.  
  40.        public static string WriteName(string name) 
  41.        { 
  42.            return "Welcome "+name +" Come here"
  43.        } 
  44.  
  45.        public string WirteNopara() 
  46.        { 
  47.            return "The method is no parameter "
  48.        } 
  49.    } 

然后建立一個控制臺程序用來動態(tài)加載上面生成的程序集和輸出類型中的成員,代碼中有詳細的介紹。

  1. class Program 
  2.     { 
  3.         static void Main(string[] args) 
  4.         { 
  5.             Assembly ass; 
  6.             Type[] types; 
  7.             Type typeA; 
  8.             object obj; 
  9.             try 
  10.             { 
  11.                 // 從本地中 加載程序集 然后從程序集中通過反射獲得類型的信息的,并且調(diào)用方法 
  12.                 ass = Assembly.LoadFrom(@"D:\ClassLibrary1.dll"); 
  13.                 types = ass.GetTypes(); 
  14.                 foreach (Type type in types) 
  15.                 { 
  16.                     Console.WriteLine("Class Name is " + type.FullName); 
  17.                     Console.WriteLine("Constructor Information"); 
  18.                     Console.WriteLine("-----------------------"); 
  19.                     // 獲取類型的結(jié)構(gòu)信息 
  20.                     ConstructorInfo[] myconstructors = type.GetConstructors(); 
  21.                     ShowMessage<ConstructorInfo>(myconstructors); 
  22.  
  23.                     Console.WriteLine("Fields Information"); 
  24.                     Console.WriteLine("-----------------------"); 
  25.                     // 獲取類型的字段信息 
  26.                     FieldInfo[] myfields = type.GetFields(); 
  27.                     ShowMessage<FieldInfo>(myfields); 
  28.  
  29.                     Console.WriteLine("All Methods Information"); 
  30.                     Console.WriteLine("-----------------------"); 
  31.                     // 獲取方法信息 
  32.                     MethodInfo[] myMethodInfo = type.GetMethods(); 
  33.                     ShowMessage<MethodInfo>(myMethodInfo); 
  34.  
  35.                     Console.WriteLine("All Properties Information"); 
  36.                     Console.WriteLine("-----------------------"); 
  37.                     // 獲取屬性信息 
  38.                     PropertyInfo[] myproperties = type.GetProperties(); 
  39.                     ShowMessage<PropertyInfo>(myproperties); 
  40.                 } 
  41.  
  42.                 // 用命名空間+類名獲取類型 
  43.                 typeA = ass.GetType("ClassLibrary1.ReflectTestClass"); 
  44.                  
  45.                 // 獲得方法名稱 
  46.  
  47.                 MethodInfo method = typeA.GetMethod("writeString"); 
  48.  
  49.                 // 創(chuàng)建實例 
  50.                 obj = ass.CreateInstance("ClassLibrary1.ReflectTestClass"); 
  51.  
  52.                 string result = (String)method.Invoke(obj,new string[] {"Tom"}); 
  53.                 Console.WriteLine("Invoke Method With Parameter"); 
  54.                 Console.WriteLine("-----------------------"); 
  55.                 Console.WriteLine(result); 
  56.                 Console.WriteLine("-----------------------"); 
  57.                 Console.WriteLine(); 
  58.                 method = typeA.GetMethod("WriteName"); 
  59.                 result = (string)method.Invoke(null,new string[] {"Tom"}); 
  60.                 Console.WriteLine("Invoke Static Method with Parameter"); 
  61.                 Console.WriteLine("-----------------------"); 
  62.                 Console.WriteLine(result); 
  63.                 Console.WriteLine("-----------------------"); 
  64.                 Console.WriteLine(); 
  65.                 method = typeA.GetMethod("WirteNopara"); 
  66.                 Console.WriteLine("Invoke Method with NOParameter"); 
  67.                 result = (string)method.Invoke(obj, null); 
  68.                 Console.WriteLine("-----------------------"); 
  69.                 Console.WriteLine(result); 
  70.                 Console.WriteLine("-----------------------"); 
  71.             } 
  72.  
  73.             catch(FileNotFoundException ex) 
  74.             { 
  75.                 Console.WriteLine(ex.Message); 
  76.             } 
  77.  
  78.             Console.ReadLine(); 
  79.         } 
  80.  
  81.         /// <summary> 
  82.         /// 顯示數(shù)組信息 
  83.         /// </summary> 
  84.         /// <typeparam name="T"></typeparam> 
  85.         /// <param name="os"></param> 
  86.         public static void ShowMessage<T>(T[] array) 
  87.         {  
  88.             foreach(T member in array) 
  89.             { 
  90.                 Console.WriteLine(member.ToString()); 
  91.             } 
  92.  
  93.             Console.WriteLine("-----------------------"); 
  94.             Console.WriteLine(); 
  95.         } 
  96.     } 

篩選返回的成員種類

可以調(diào)用Type的GetMembers,GetFields,GetMethods,GetProperties或者GetEvenents方法來查詢一個類型的成員。在調(diào)用上面的任何一個方法時,都可以傳遞System.Reflection.BindingFlags枚舉類型的一個實例,使用這個枚舉類型目的是對這些方法返回的成員進行篩選。對于這個枚舉類型中成員的信息可以參考MSDN:http://msdn.microsoft.com/zh-cn/library/system.reflection.bindingflags(v=VS.80).aspx

注意:在返回一個成員集合的所有方法中, 都有一個不獲取任何實參的重載版本。如果不傳遞BindingFlags實參,所有這些方法都返回公共成員,默認設(shè)置為BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static. (如果指定Public或NonPublic,那么必須同時指定Instance,否則不返回成員)。

 

原文鏈接:http://www.cnblogs.com/zhili/archive/2012/07/08/AssemblyLoad_and_Reflection.html

【編輯推薦】

 

責任編輯:彭凡 來源: 博客園
相關(guān)推薦

2012-02-08 10:12:19

Java反射

2009-02-03 09:42:53

JAVA類JVM指令forName方法

2023-10-17 09:26:44

Java工具

2012-02-08 09:44:52

Java反射

2012-04-05 13:50:38

Java

2013-10-12 13:26:08

設(shè)計加載

2011-05-26 15:23:34

JavaReflection

2017-03-24 09:44:33

Java反射機制

2017-05-17 15:28:15

Java反射機制

2011-09-27 10:23:24

Java反射機制

2011-03-09 09:11:52

java反射機制

2010-08-11 09:40:44

LINQ

2011-11-23 14:40:36

程序員

2024-09-29 09:02:17

Go語言類型

2013-03-14 09:54:54

jQueryJS

2018-01-12 10:25:48

Nginx信號集master

2018-08-06 14:18:09

Linux應(yīng)用程序技術(shù)

2011-04-01 14:50:56

Java的反射機制

2009-06-17 13:57:54

java實例Reflection

2009-09-03 11:00:29

C#反射機制
點贊
收藏

51CTO技術(shù)棧公眾號