目次
リフレクション" >リフレクション
IOC" >IOC
IOCコード例" >IOCコード例

リフレクションとIOC

Feb 23, 2017 am 09:46 AM

リフレクション

リフレクションのメカニズムは、実行状態では、どのクラスでも、このクラスのすべてのプロパティとメソッドを知ることができ、その種類のメソッドを呼び出すことができます。オブジェクトのメソッドを動的に取得して動的に呼び出す機能は、リフレクション メカニズムと呼ばれます。リフレクション機構は動的にメソッドを取得して利用する仕組みであり、クラスのオブジェクトを直接作成して直接呼び出すのとは全く異なります。たとえば、クラスにプライベートなプロパティまたはメソッドがある場合、それを直接呼び出すことはできませんが、リフレクション メカニズムを使用して動的に呼び出すことができます。

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) に注目してください。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Java でのインターフェイスと抽象クラスのリフレクション メカニズムの実装 Java でのインターフェイスと抽象クラスのリフレクション メカニズムの実装 May 02, 2024 pm 05:18 PM

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

golang でリフレクションを使用してプライベート フィールドとメソッドにアクセスする方法 golang でリフレクションを使用してプライベート フィールドとメソッドにアクセスする方法 May 03, 2024 pm 12:15 PM

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

セキュリティ上の考慮事項と Golang リフレクションの最適なソリューション セキュリティ上の考慮事項と Golang リフレクションの最適なソリューション May 04, 2024 pm 04:48 PM

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

golangでリフレクションを使用して変数値を動的に変更する方法 golangでリフレクションを使用して変数値を動的に変更する方法 May 02, 2024 am 11:09 AM

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

Golang のリフレクションとアプリケーション シナリオの分析の概要 Golang のリフレクションとアプリケーション シナリオの分析の概要 Apr 03, 2024 pm 01:45 PM

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

Go言語によるIOCの実装と実践:制御の反転について詳しく解説 Go言語によるIOCの実装と実践:制御の反転について詳しく解説 Apr 07, 2024 pm 02:33 PM

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

golang でリフレクションを使用して新しい型を作成する方法 golang でリフレクションを使用して新しい型を作成する方法 May 01, 2024 am 09:21 AM

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

メソッドのオーバーロードに Java リフレクション メカニズムを使用しますか? メソッドのオーバーロードに Java リフレクション メカニズムを使用しますか? Apr 15, 2024 pm 10:54 PM

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

See all articles