リフレクションとIOC
リフレクション
リフレクションのメカニズムは、実行状態では、どのクラスでも、このクラスのすべてのプロパティとメソッドを知ることができ、その種類のメソッドを呼び出すことができます。オブジェクトのメソッドを動的に取得して動的に呼び出す機能は、リフレクション メカニズムと呼ばれます。リフレクション機構は動的にメソッドを取得して利用する仕組みであり、クラスのオブジェクトを直接作成して直接呼び出すのとは全く異なります。たとえば、クラスにプライベートなプロパティまたはメソッドがある場合、それを直接呼び出すことはできませんが、リフレクション メカニズムを使用して動的に呼び出すことができます。
IOC
IOCの最大の利点は、オブジェクト生成がXMLで定義されているため、実装サブクラスを変更する必要がある場合、非常に簡単になることです(通常、そのようなオブジェクトは特定のインターフェイスに実装されている場合)、XML を変更するだけで、オブジェクトのホットプラグ(USB インターフェイスや SCSI ハードディスクのようなもの)を実現することもできます。 IOC が適用されない前に、オブジェクトが別のオブジェクトに依存する場合 (以下、これを依存オブジェクトおよび依存オブジェクトと呼びます)、依存オブジェクト内のメソッドを実行できるように、依存オブジェクト内で依存オブジェクトをインスタンス化する必要があります。と呼ばれた。明らかに、この結合度は比較的高く、私たちのプログラミング原則に準拠していません。したがって、今回は、依存オブジェクトを依存オブジェクトに直接配信する役割を担うサードパーティ オブジェクトを導入し、両者間の結合を軽減します。次の図は、IOC コンテナを追加する前と後のシステム内のオブジェクトの結合度を比較したものです。図 1 に示すように、IOC コンテナがソフトウェア システムに導入される前は、オブジェクト A がオブジェクト B に依存していました。オブジェクト A が初期化されるか、特定の時点まで実行されると、オブジェクト B を積極的に作成するか、すでに作成されているオブジェクト B を使用する必要があります。オブジェクト B を作成する場合も使用する場合も、コントロールはあなたの手の中にあります。 IOC コンテナがソフトウェア システムに導入された後、この状況は完全に変わりました。図 2 に示すように、IOC コンテナの追加により、オブジェクト A が実行されると、オブジェクト A とオブジェクト B の間の直接の接続が失われます。 B の場合、IOC コンテナはオブジェクト B をアクティブに作成し、オブジェクト A が必要とする場所にそれを挿入します。 前後を比較すると、オブジェクト A がオブジェクト B に依存する過程が能動的な動作から受動的な動作に変化し、制御権が逆転することがわかります。これが「反転」の名前の由来です。コントロール"。
インスタンス
リフレクションサンプルコード
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StudentDAL { public class Student { //属性 public string Name{get;set;} public int Age { get; set; } //无参数构造函数 public Student() { this.Name = "无参数"; this.Age = 0; } //有参数构造函数 public Student(string name, int age) { this.Name = "name"; this.Age = age; } //public带参带返回值函数 public string PublishMethodReturn() { return string.Format("我叫"+Name+"年龄" +Age); } } }</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace ITOO_Reflection { class Program { static void Main(string[] args) { //使用 Assembly 定义和加载程序集, //加载在程序集清单中列出的模块, //以及从此程序集中查找类型并创建该类型的实例. //获取程序集 Assembly assembly = Assembly.Load("StudentDAL"); //从程序及获取指定对象类型 Type type = assembly.GetType("StudentDAL.Student"); var instance = assembly.CreateInstance("StudentDAL.Student"); //为学生类的属性赋值 type.GetProperty("Name").SetValue(instance, "shx", null); type.GetProperty("Age").SetValue(instance, 18, null); //获取Student类的方法 var method = type.GetMethod("PublishMethodReturn"); //调用Student类的成员方法PublishMethodReturn var S= method.Invoke(instance, null); Console.WriteLine(S); Console.Read(); } } }</strong></span>
実行結果
IOCコード例
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ITOO.IOC.IDAL
{
public interface IUserDal
{
void HelloWord();
}
}
</strong></span>
ログイン後にコピー<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITOO.IOC.IDAL;
namespace ITOO.IOC.DAL
{
public class User:IUserDal
{
public void HelloWord()
{
Console.WriteLine("helloword");
}
}
}
</strong></span>
ログイン後にコピー<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ITOO.IOC.IBLL
{
public interface IUserBll
{
void HelloWord();
}
}
</strong></span>
ログイン後にコピーrreerree
実行結果
以上です。 IOC の内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ITOO.IOC.IDAL { public interface IUserDal { void HelloWord(); } } </strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; using ITOO.IOC.IDAL; namespace ITOO.IOC.DAL { public class User:IUserDal { public void HelloWord() { Console.WriteLine("helloword"); } } } </strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ITOO.IOC.IBLL { public interface IUserBll { void HelloWord(); } } </strong></span>



ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









リフレクション メカニズムを使用すると、プログラムは実行時にクラス情報を取得および変更できます。これを使用して、インターフェイスおよび抽象クラスのリフレクションを実装できます。 インターフェイス リフレクション: Class.forName() を通じてインターフェイス リフレクション オブジェクトを取得し、そのメタデータ (名前、メソッド、および) にアクセスします。分野) 。抽象クラスのリフレクション: インターフェイスと同様に、抽象クラスのリフレクション オブジェクトを取得し、そのメタデータと非抽象メソッドにアクセスできます。実際のケース: リフレクション メカニズムを使用して動的プロキシを実装し、プロキシ クラスを動的に作成することで実行時にインターフェイス メソッドへの呼び出しをインターセプトできます。

リフレクションを使用して、Go 言語のプライベート フィールドおよびメソッドにアクセスできます。 プライベート フィールドにアクセスするには、reflect.ValueOf() を通じて値のリフレクション値を取得し、次に FieldByName() を使用してフィールドのリフレクション値を取得し、 String() メソッドを使用してフィールドの値を出力します。プライベート メソッドを呼び出します。また、reflect.ValueOf() を通じて値のリフレクション値を取得し、次に MethodByName() を使用してメソッドのリフレクション値を取得し、最後に Call() メソッドを呼び出してメソッドを実行します。実際のケース: プライベート フィールドの値を変更し、リフレクションを通じてプライベート メソッドを呼び出して、オブジェクト コントロールと単体テスト カバレッジを実現します。

Reflection は Go の型チェックと変更機能を提供しますが、任意のコードの実行、型偽造、データ漏洩などのセキュリティ リスクがあります。ベスト プラクティスには、リフレクション権限や操作の制限、ホワイトリストまたはブラックリストの使用、入力の検証、セキュリティ ツールの使用が含まれます。実際には、リフレクションを安全に使用して型情報を検査できます。

Go 言語のリフレクションを使用すると、ブール値、整数、浮動小数点数、文字列の変更など、実行時に変数値を操作できます。変数の値を取得すると、SetBool、SetInt、SetFloat、および SetString メソッドを呼び出して変数を変更できます。たとえば、JSON 文字列を構造に解析し、リフレクションを使用して構造フィールドの値を変更できます。反映操作は遅く、変更不可能なフィールドは変更できないことに注意してください。構造フィールドの値を変更する場合、関連するフィールドは自動的に更新されない場合があります。

Go 言語のリフレクション機能を使用すると、プログラムは実行時に型の構造を検査および変更できます。 Type、Value、reflect.Kindを使用することで、オブジェクトの型情報、フィールド値、メソッドを取得したり、オブジェクトの作成や変更を行うこともできます。具体的な操作方法としては、型の確認(TypeOf())、フィールド値の取得(ValueOf()、FieldByName())、フィールド値の変更(Set())、オブジェクトの作成(New())などがあります。

制御の反転は、オブジェクトの作成と依存関係の管理をクライアント コードからコンテナーに移し、コードの柔軟性とテスト容易性を向上させる設計パターンです。 Go 言語での IOC の実装には、ワイヤー フレームワークを使用できます。具体的な手順には、インターフェイスの定義、型の定義、ワイヤー関数の使用が含まれます。ワイヤーで生成されたコンテナーを使用すると、テスト容易性、柔軟性、構成の簡素化が向上するという利点が得られます。

Go では、リフレクションを使用して新しい型を作成できます。 1. 既存の型の Reflect.Type 値を取得するには、reflect.New() を使用します。 3. *Ptr.Elem() を使用して実際の値にアクセスします。 4. リフレクションは、柔軟で動的なプログラムを構築するために使用される文字列に基づいて新しい型を動的に作成することもできます。

リフレクション メカニズムは、Java でメソッドのオーバーロードを実装するために使用されます。 リフレクションを通じてメソッドを取得します。 getMethod() メソッドを使用してメソッド オブジェクトを取得し、メソッド名とパラメータのタイプを指定します。メソッドの呼び出し: invoke() メソッドを使用してメソッドを呼び出し、呼び出し元のオブジェクトとパラメーター値を指定します。
