十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇內(nèi)容介紹了“Java程序集加載和反射機(jī)制是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

公司主營(yíng)業(yè)務(wù):做網(wǎng)站、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出觀山湖免費(fèi)做網(wǎng)站回饋大家。
一、程序集的加載
JIT編譯器器將IL代碼編譯成本地代碼時(shí), 會(huì)查看IL代碼中引用了哪些類型。在運(yùn)行過程中,JIT編譯器利用程序集的TypeRef和AssemblyRef元數(shù)據(jù)表來確定哪一個(gè)程序集定義了所引用的類型,然后JIT編譯器將對(duì)應(yīng)程序集加載到AppDomain中,在內(nèi)部,CLR使用System.Reflection.Assembly類的靜態(tài)方法Load來嘗試加載一個(gè)程序集。然而如果我們想動(dòng)態(tài)加載一個(gè)程序集時(shí),可以使用Assembly的Load方法來動(dòng)態(tài)加載程序集,其中Assembly類中還提供了其他的加載程序集方法,有LoadFrom(string path), LoadFile(stringassemblyFile)等。
二、反射機(jī)制
.net中反射在運(yùn)行中過程中解析程序集中的元數(shù)據(jù),獲得類型中的成員(包括字段、構(gòu)造器、方法、屬性、事件等)信息。
把下面的類放在一個(gè)類庫工程中,并編譯生成程序集(例如為ClassLibrary1.dll,假設(shè)把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; } } /// /// No Paramter Constructor /// public ReflectTestClass() { } /// /// Constructor with Parameter /// /// /// 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 "; } }然后建立一個(gè)控制臺(tái)程序用來動(dòng)態(tài)加載上面生成的程序集和輸出類型中的成員,代碼中有詳細(xì)的介紹。
class Program { static void Main(string[] args) { Assembly ass; Type[] types; Type typeA; object obj; try { // 從本地中 加載程序集 然后從程序集中通過反射獲得類型的信息的,并且調(diào)用方法 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("-----------------------"); // 獲取類型的結(jié)構(gòu)信息 ConstructorInfo[] myconstructors = type.GetConstructors(); ShowMessage(myconstructors); Console.WriteLine("Fields Information"); Console.WriteLine("-----------------------"); // 獲取類型的字段信息 FieldInfo[] myfields = type.GetFields(); ShowMessage(myfields); Console.WriteLine("All Methods Information"); Console.WriteLine("-----------------------"); // 獲取方法信息 MethodInfo[] myMethodInfo = type.GetMethods(); ShowMessage(myMethodInfo); Console.WriteLine("All Properties Information"); Console.WriteLine("-----------------------"); // 獲取屬性信息 PropertyInfo[] myproperties = type.GetProperties(); ShowMessage(myproperties); } // 用命名空間+類名獲取類型 typeA = ass.GetType("ClassLibrary1.ReflectTestClass"); // 獲得方法名稱 MethodInfo method = typeA.GetMethod("writeString"); // 創(chuàng)建實(shí)例 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(); } /// /// 顯示數(shù)組信息 /// /// /// public static void ShowMessage(T[] array) { foreach(T member in array) { Console.WriteLine(member.ToString()); } Console.WriteLine("-----------------------"); Console.WriteLine(); } } 篩選返回的成員種類
可以調(diào)用Type的GetMembers,GetFields,GetMethods,GetProperties或者GetEvenents方法來查詢一個(gè)類型的成員。在調(diào)用上面的任何一個(gè)方法時(shí),都可以傳遞System.Reflection.BindingFlags枚舉類型的一個(gè)實(shí)例,使用這個(gè)枚舉類型目的是對(duì)這些方法返回的成員進(jìn)行篩選。
注意:在返回一個(gè)成員集合的所有方法中, 都有一個(gè)不獲取任何實(shí)參的重載版本。如果不傳遞BindingFlags實(shí)參,所有這些方法都返回公共成員,默認(rèn)設(shè)置為BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static. (如果指定Public或NonPublic,那么必須同時(shí)指定Instance,否則不返回成員)。
“Java程序集加載和反射機(jī)制是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!