検索
ホームページJava&#&チュートリアルJava のアセンブリのロードとリフレクションのメカニズムとは何ですか?

1. アセンブリの読み込み

JIT コンパイラーは IL コードをローカル コードにコンパイルするときに、IL コード内でどの型が参照されているかを確認します。実行時、JIT コンパイラはアセンブリの TypeRef および AssemblyRef メタデータ テーブルを使用して、参照される型を定義するアセンブリを決定します。その後、JIT コンパイラは対応するアセンブリを AppDomain に読み込みます。内部的に、CLR は .Reflection の System The static メソッド Load を使用します。アセンブリ クラスはアセンブリの読み込みを試みます。ただし、アセンブリを動的にロードする場合は、Assembly の Load メソッドを使用してアセンブリを動的にロードできます。Assembly クラスには、LoadFrom(string path)、LoadFile(stringassemblyFile) などの他のロード アセンブリ メソッドも提供されます。

2. リフレクション メカニズム

.net のリフレクションは、実行中にアセンブリ内のメタデータを解析し、型のメンバー (フィールドやコンストラクターを含む)、メソッド、プロパティ、イベントなど)情報。

アセンブリを動的に読み込み、型のメンバーを取得します。

次のクラスをクラス ライブラリ プロジェクトに配置し、アセンブリをコンパイルして生成します (たとえば、DLL が ClassLibrary1.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>        /// <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></typeparam>         /// <param>         public static void ShowMessage<t>(T[] array)         {              foreach(T member in array)             {                 Console.WriteLine(member.ToString());             }              Console.WriteLine("-----------------------");             Console.WriteLine();         }     }</t></propertyinfo></methodinfo></fieldinfo></constructorinfo>

返されたメンバーの型をフィルターする

Type の GetMembers、GetFields、GetMethods、GetProperties、または GetEvenents メソッドを呼び出して、型のメンバーをクエリできます。上記のメソッドのいずれかを呼び出すときは、System.Reflection.BindingFlags 列挙型のインスタンスを渡すことができます。この列挙型を使用する目的は、これらのメソッドによって返されるメンバーをフィルター処理することです。

注: メンバー コレクションを返すすべてのメソッドの中には、実際のパラメーターを取得しないオーバーロードされたバージョンがあります。 BindingFlags 実パラメータが渡されない場合、これらのメソッドはすべてパブリック メンバーを返し、デフォルト設定は BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static です (Public または NonPublic が指定されている場合は、Instance も同時に指定する必要があります)。そうでない場合、メンバーは返されません)。

以上がJava のアセンブリのロードとリフレクションのメカニズムとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境