91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java程序集加載和反射機制是什么

發布時間:2022-03-31 16:07:14 來源:億速云 閱讀:206 作者:iii 欄目:編程語言

本篇內容介紹了“Java程序集加載和反射機制是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、程序集的加載

JIT編譯器器將IL代碼編譯成本地代碼時, 會查看IL代碼中引用了哪些類型。在運行過程中,JIT編譯器利用程序集的TypeRef和AssemblyRef元數據表來確定哪一個程序集定義了所引用的類型,然后JIT編譯器將對應程序集加載到AppDomain中,在內部,CLR使用System.Reflection.Assembly類的靜態方法Load來嘗試加載一個程序集。然而如果我們想動態加載一個程序集時,可以使用Assembly的Load方法來動態加載程序集,其中Assembly類中還提供了其他的加載程序集方法,有LoadFrom(string path), LoadFile(stringassemblyFile)等。

二、反射機制

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

動態加載一個程序集并獲得類型中的成員

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

public class ReflectTestClass    {       public  string name;       public int age;       public string Name       {           get { return name; }           set { name = value; }       }        public int Age       {           get { return age; }           set { age = value; }       }         /// <summary>        /// No Paramter Constructor        /// </summary>       public ReflectTestClass()       {        }         /// <summary>        /// Constructor with Parameter        /// </summary>        /// <param name="name"></param>        /// <param name="age"></param>        public ReflectTestClass(string names,int ages)        {            this.name = names;            this.age = ages;        }         public string writeString(string name)        {            return "Welcome " + name;        }         public static string WriteName(string name)        {            return "Welcome "+name +" Come here";        }         public string WirteNopara()        {            return "The method is no parameter ";        }    }

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

class Program     {         static void Main(string[] args)         {             Assembly ass;             Type[] types;             Type typeA;             object obj;             try             {                 // 從本地中 加載程序集 然后從程序集中通過反射獲得類型的信息的,并且調用方法                 ass = Assembly.LoadFrom(@"D:\ClassLibrary1.dll");                 types = ass.GetTypes();                 foreach (Type type in types)                 {                     Console.WriteLine("Class Name is " + type.FullName);                     Console.WriteLine("Constructor Information");                     Console.WriteLine("-----------------------");                     // 獲取類型的結構信息                     ConstructorInfo[] myconstructors = type.GetConstructors();                     ShowMessage<ConstructorInfo>(myconstructors);                      Console.WriteLine("Fields Information");                     Console.WriteLine("-----------------------");                     // 獲取類型的字段信息                     FieldInfo[] myfields = type.GetFields();                     ShowMessage<FieldInfo>(myfields);                      Console.WriteLine("All Methods Information");                     Console.WriteLine("-----------------------");                     // 獲取方法信息                     MethodInfo[] myMethodInfo = type.GetMethods();                     ShowMessage<MethodInfo>(myMethodInfo);                      Console.WriteLine("All Properties Information");                     Console.WriteLine("-----------------------");                     // 獲取屬性信息                     PropertyInfo[] myproperties = type.GetProperties();                     ShowMessage<PropertyInfo>(myproperties);                 }                  // 用命名空間+類名獲取類型                 typeA = ass.GetType("ClassLibrary1.ReflectTestClass");                                  // 獲得方法名稱                  MethodInfo method = typeA.GetMethod("writeString");                  // 創建實例                 obj = ass.CreateInstance("ClassLibrary1.ReflectTestClass");                  string result = (String)method.Invoke(obj,new string[] {"Tom"});                 Console.WriteLine("Invoke Method With Parameter");                 Console.WriteLine("-----------------------");                 Console.WriteLine(result);                 Console.WriteLine("-----------------------");                 Console.WriteLine();                 method = typeA.GetMethod("WriteName");                 result = (string)method.Invoke(null,new string[] {"Tom"});                 Console.WriteLine("Invoke Static Method with Parameter");                 Console.WriteLine("-----------------------");                 Console.WriteLine(result);                 Console.WriteLine("-----------------------");                 Console.WriteLine();                 method = typeA.GetMethod("WirteNopara");                 Console.WriteLine("Invoke Method with NOParameter");                 result = (string)method.Invoke(obj, null);                 Console.WriteLine("-----------------------");                 Console.WriteLine(result);                 Console.WriteLine("-----------------------");             }              catch(FileNotFoundException ex)             {                 Console.WriteLine(ex.Message);             }              Console.ReadLine();         }          /// <summary>         /// 顯示數組信息         /// </summary>         /// <typeparam name="T"></typeparam>         /// <param name="os"></param>         public static void ShowMessage<T>(T[] array)         {              foreach(T member in array)             {                 Console.WriteLine(member.ToString());             }              Console.WriteLine("-----------------------");             Console.WriteLine();         }     }

篩選返回的成員種類

可以調用Type的GetMembers,GetFields,GetMethods,GetProperties或者GetEvenents方法來查詢一個類型的成員。在調用上面的任何一個方法時,都可以傳遞System.Reflection.BindingFlags枚舉類型的一個實例,使用這個枚舉類型目的是對這些方法返回的成員進行篩選。

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

“Java程序集加載和反射機制是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安吉县| 宜兴市| 清涧县| 始兴县| 十堰市| 中方县| 北海市| 桑植县| 蒙城县| 浦东新区| 荆州市| 汕头市| 高平市| 旬邑县| 泰和县| 丁青县| 金华市| 涟源市| 自治县| 友谊县| 龙游县| 广饶县| 政和县| 海口市| 宁陵县| 福鼎市| 开化县| 兴海县| 哈密市| 布尔津县| 庄浪县| 林芝县| 武穴市| 同江市| 玉溪市| 汝州市| 怀仁县| 大姚县| 双鸭山市| 女性| 滨州市|