Rumah  >  Artikel  >  Java  >  Apakah mekanisme pemuatan dan pantulan pemasangan di Jawa?

Apakah mekanisme pemuatan dan pantulan pemasangan di Jawa?

王林
王林ke hadapan
2023-05-07 13:25:07685semak imbas

1. Memuatkan pemasangan

Apabila pengkompil JIT menyusun kod IL ke dalam kod tempatan, ia akan menyemak jenis yang dirujuk dalam kod IL. Semasa masa jalanan, pengkompil JIT menggunakan jadual metadata TypeRef dan AssemblyRef untuk menentukan pemasangan yang mentakrifkan jenis yang dirujuk Pengkompil JIT kemudian memuatkan pemasangan yang sepadan ke dalam AppDomain, CLR menggunakan System The static method Load of the .Reflection. Kelas perhimpunan cuba memuatkan perhimpunan. Walau bagaimanapun, jika kita ingin memuatkan perhimpunan secara dinamik, kita boleh menggunakan kaedah Muatkan Perhimpunan untuk memuatkan himpunan secara dinamik Kelas Perhimpunan juga menyediakan kaedah pemasangan pemuatan lain, termasuk LoadFrom(laluan rentetan), LoadFile(stringassemblyFile), dsb.

2. Mekanisme refleksi

Refleksi dalam .net menghuraikan metadata dalam perhimpunan semasa berjalan dan mendapatkan ahli jenis (termasuk medan dan pembina), kaedah, hartanah, peristiwa, dsb.) maklumat.

Muat perhimpunan secara dinamik dan dapatkan ahli jenis

Letakkan kelas berikut dalam projek perpustakaan kelas dan susun serta jana perhimpunan (contohnya, ClassLibrary1.dll, dengan anggapan bahawa dll Letakkannya di bawah direktori akar pemacu 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 ";        }    }

Kemudian buat program konsol untuk memuatkan himpunan yang dijana di atas secara dinamik dan ahli bagi jenis keluaran tersebut.

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();         }     }

Tapis jenis ahli yang dikembalikan

Anda boleh memanggil kaedah Jenis GetMembers, GetFields, GetMethods, GetProperties atau GetEvenents untuk menanyakan ahli sesuatu jenis. Apabila memanggil mana-mana kaedah di atas, anda boleh menghantar contoh jenis penghitungan System.Reflection.BindingFlags Tujuan menggunakan jenis penghitungan ini adalah untuk menapis ahli yang dikembalikan oleh kaedah ini.

Nota: Antara semua kaedah yang mengembalikan koleksi ahli, terdapat versi terlebih muatan yang tidak memperoleh sebarang parameter sebenar. Jika parameter sebenar BindingFlags tidak diluluskan, semua kaedah ini mengembalikan ahli awam dan tetapan lalai ialah BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static (Jika Awam atau Bukan Awam ditentukan, Contoh mesti dinyatakan pada masa yang sama, jika tidak tiada ahli akan dikembalikan).

Atas ialah kandungan terperinci Apakah mekanisme pemuatan dan pantulan pemasangan di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam