Inhaltsverzeichnis
Reflexion" >Reflexion
IOC" >IOC
Instanz" >Instanz
Reflection-Instanzcode" >Reflection-Instanzcode
Laufergebnis" >Laufergebnis
IOC-Beispielcode" >IOC-Beispielcode
Laufergebnisse" >Laufergebnisse

Reflexion und IOC

Feb 23, 2017 am 09:46 AM

Reflexion

Der Reflexionsmechanismus befindet sich im laufenden Zustand und kann alle Attribute und Attribute kennen Diese Klasse. Für jedes Objekt kann jede seiner Methoden aufgerufen werden. Diese Funktion zum dynamischen Abrufen und dynamischen Aufrufen der Methoden des Objekts wird als Reflexionsmechanismus bezeichnet. Der Reflexionsmechanismus ruft Methoden dynamisch ab und verwendet sie. Dies unterscheidet sich völlig vom direkten Erstellen eines Objekts einer Klasse und dem direkten Aufruf. Wenn es beispielsweise eine private Eigenschaft oder Methode in einer Klasse gibt, können wir sie nicht direkt aufrufen, aber wir können den Reflexionsmechanismus verwenden, um sie dynamisch aufzurufen.

IOC

Der größte Vorteil von IOC ist die Objektgenerierung on Es ist in XML definiert. Wenn wir also eine Implementierungsunterklasse ändern müssen, wird es sehr einfach (im Allgemeinen werden solche Objekte in einer Art Schnittstelle implementiert). Modifizieren Sie einfach das XML, damit wir überhaupt die Aktualität der Klasse erkennen können Objekt ein- und ausstecken (ein bisschen wie USB-Schnittstelle und SCSI-Festplatte). Bevor IOC nicht anwendbar ist, müssen wir, wenn ein Objekt von einem anderen Objekt abhängt (im Folgenden werden wir es als abhängiges Objekt und abhängiges Objekt bezeichnen), ein abhängiges Objekt im abhängigen Objekt instanziieren, damit Methoden im abhängigen Objekt aufgerufen werden können . Offensichtlich ist dieser Kopplungsgrad relativ hoch und entspricht nicht unseren Programmierprinzipien. Daher werden wir zu diesem Zeitpunkt ein Drittanbieterobjekt einführen, das für die direkte Übergabe eines abhängigen Objekts an das abhängige Objekt verantwortlich ist, wodurch die Kopplung zwischen den beiden verringert wird. Die folgende Abbildung zeigt den Vergleich der Objektkopplung im System vor und nach dem Hinzufügen des IOC-Containers


Bevor der IOC-Container in das Softwaresystem eingeführt wurde, wie in Abbildung 1 dargestellt, hängt Objekt A von Objekt B ab. Dann muss Objekt A es aktiv erstellen, wenn es initialisiert wird oder läuft bis zu einem bestimmten Punkt oder verwendet ein bereits erstelltes Objekt B. Unabhängig davon, ob Sie Objekt B erstellen oder verwenden, liegt die Kontrolle in Ihren Händen.
Nachdem der IOC-Container in das Softwaresystem eingeführt wurde, änderte sich diese Situation vollständig. Wie in Abbildung 2 gezeigt, ging die direkte Verbindung zwischen Objekt A und Objekt B verloren A läuft zu Wenn Objekt B benötigt wird, erstellt der IOC-Container aktiv ein Objekt B und fügt es an der Stelle ein, an der Objekt A benötigt wird.
Durch den Vergleich vorher und nachher ist es nicht schwer zu erkennen, dass sich der Prozess der Abhängigkeit von Objekt A von Objekt B von aktivem Verhalten zu passivem Verhalten ändert und die Kontrollrechte umgekehrt werden. Dies ist der Ursprung des Namens. Umkehrung der Kontrolle“.

Instanz

Reflection-Instanzcode


<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>
Nach dem Login kopieren
<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>
Nach dem Login kopieren


Laufergebnis



IOC-Beispielcode



<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>
Nach dem Login kopieren
<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>
Nach dem Login kopieren
<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>
Nach dem Login kopieren
<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.IBLL;
using ITOO.IOC.IDAL;
using ITOO.Library.Core.AOP;

namespace ITOO.IOC.BLL
{
    public class UserBll:IUserBll
    {
        public void HelloWord()
        {
            //使用底层封装的SpringHelper从IOC容器中拿到D层的类的对象实例
            IUserDal iuser = SpringHelper.GetObject<IUserDal>("User");
            iuser.HelloWord();
        }
    }
}
</strong></span>
Nach dem Login kopieren
<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.IBLL;
using ITOO.Library.Core.AOP;

namespace ITOO.IOC.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            //客户端通过底层封装的SpringHelper从IOC容器中根据B层类的对象的id拿到UserBll类的实例
            IUserBll iuserbll = SpringHelper.GetObject<IUserBll>("UserBll");
            //调用UserBll类的方法
            iuserbll.HelloWord();
            Console.Read();
        }
    }
}
</strong></span>
Nach dem Login kopieren


Laufergebnisse



Das Obige ist der Inhalt der Reflexion und des IOC. Weitere verwandte Inhalte finden Sie hier die chinesische PHP-Website (www.php.cn)!



Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1665
14
PHP-Tutorial
1270
29
C#-Tutorial
1249
24
Reflexionsmechanismus-Implementierung von Schnittstellen und abstrakten Klassen in Java Reflexionsmechanismus-Implementierung von Schnittstellen und abstrakten Klassen in Java May 02, 2024 pm 05:18 PM

Der Reflexionsmechanismus ermöglicht es Programmen, Klasseninformationen zur Laufzeit abzurufen und zu ändern. Er kann zur Implementierung der Reflexion von Schnittstellen und abstrakten Klassen verwendet werden: Schnittstellenreflexion: Erhalten Sie das Schnittstellenreflexionsobjekt über Class.forName() und greifen Sie auf seine Metadaten (Name, Methode usw.) zu Feld) . Reflexion abstrakter Klassen: Ähnlich wie bei Schnittstellen können Sie das Reflexionsobjekt einer abstrakten Klasse abrufen und auf deren Metadaten und nicht-abstrakte Methoden zugreifen. Praktischer Fall: Der Reflexionsmechanismus kann zur Implementierung dynamischer Proxys verwendet werden, indem Aufrufe von Schnittstellenmethoden zur Laufzeit durch dynamisches Erstellen von Proxy-Klassen abgefangen werden.

So verwenden Sie Reflection, um auf private Felder und Methoden in Golang zuzugreifen So verwenden Sie Reflection, um auf private Felder und Methoden in Golang zuzugreifen May 03, 2024 pm 12:15 PM

Sie können Reflektion verwenden, um auf private Felder und Methoden in der Go-Sprache zuzugreifen: So greifen Sie auf private Felder zu: Rufen Sie den Reflektionswert des Werts über „reflect.ValueOf()“ ab, verwenden Sie dann „FieldByName()“, um den Reflektionswert des Felds abzurufen, und rufen Sie auf String()-Methode zum Drucken des Feldwerts. Rufen Sie eine private Methode auf: Rufen Sie auch den Reflexionswert des Werts über Reflect.ValueOf () ab, verwenden Sie dann MethodByName (), um den Reflexionswert der Methode abzurufen, und rufen Sie schließlich die Methode Call () auf, um die Methode auszuführen. Praktischer Fall: Ändern Sie private Feldwerte und rufen Sie private Methoden durch Reflexion auf, um Objektkontrolle und Komponententestabdeckung zu erreichen.

Sicherheitsüberlegungen und beste Lösungen für die Golang-Reflexion Sicherheitsüberlegungen und beste Lösungen für die Golang-Reflexion May 04, 2024 pm 04:48 PM

Reflection bietet Funktionen zur Typprüfung und -änderung in Go, birgt jedoch Sicherheitsrisiken, einschließlich der Ausführung willkürlichen Codes, Typfälschung und Datenlecks. Zu den Best Practices gehören die Einschränkung reflektierender Berechtigungen und Vorgänge, die Verwendung von Whitelists oder Blacklists, die Validierung von Eingaben und die Verwendung von Sicherheitstools. In der Praxis kann die Reflexion sicher zur Überprüfung von Typinformationen eingesetzt werden.

Die Golang-Funktion verwendet Reflexion, um aspektorientierte Programmierung zu implementieren Die Golang-Funktion verwendet Reflexion, um aspektorientierte Programmierung zu implementieren Apr 25, 2024 pm 05:48 PM

Antwort: Ja, die Reflexion in der Go-Sprache kann aspektorientierte Programmierung implementieren. Detaillierte Beschreibung: Reflection ermöglicht es einem Programm, seine eigenen Typen und Werte zur Laufzeit zu ändern und zu überprüfen. Durch Reflexion können wir globale Aspekte für den Code erstellen, die vor und nach der Ausführung der Funktion ausgelöst werden. Dadurch können wir problemlos Funktionen wie die Protokollierung hinzufügen, ohne den vorhandenen Code zu ändern. Reflection bietet die Vorteile der Code-Entkopplung, Skalierbarkeit und flexiblen Steuerung und verbessert dadurch die Wartbarkeit und Wiederverwendbarkeit von Anwendungen.

Reflektiertes Licht: Erkundung des dynamischen Aufrufs von Methoden in der Go-Sprache Reflektiertes Licht: Erkundung des dynamischen Aufrufs von Methoden in der Go-Sprache Apr 08, 2024 am 10:00 AM

Reflection ist ein leistungsstarkes Tool in der Go-Sprache, das es Programmen ermöglicht, Methoden dynamisch aufzurufen. Zu den spezifischen Schritten gehören: Abrufen von Methodenmetadaten (reflect.Method) Abrufen des Methodentyps (reflect.Value) Verwenden des Methodentyps zum dynamischen Aufrufen der Methode (reflect.Func.Call) Reflection kann für die dynamische Methodenplanung, Komponententests und Codegenerierung verwendet werden. Da die Reflexion jedoch langsam arbeitet, sollte sie mit Vorsicht verwendet werden und auf die Typprüfung geachtet werden.

So verwenden Sie Reflektion, um Variablenwerte in Golang dynamisch zu ändern So verwenden Sie Reflektion, um Variablenwerte in Golang dynamisch zu ändern May 02, 2024 am 11:09 AM

Mit der Go-Sprachreflexion können Sie Variablenwerte zur Laufzeit bearbeiten, einschließlich der Änderung boolescher Werte, Ganzzahlen, Gleitkommazahlen und Zeichenfolgen. Indem Sie den Wert einer Variablen abrufen, können Sie die Methoden SetBool, SetInt, SetFloat und SetString aufrufen, um ihn zu ändern. Sie können beispielsweise einen JSON-String in eine Struktur analysieren und dann mithilfe von Reflection die Werte der Strukturfelder ändern. Es ist zu beachten, dass der Reflexionsvorgang langsam ist und nicht veränderbare Felder nicht geändert werden können. Beim Ändern des Strukturfeldwerts werden die zugehörigen Felder möglicherweise nicht automatisch aktualisiert.

Implementierung und Praxis des IOC in der Go-Sprache: Detaillierte Erläuterung der Kontrollumkehr Implementierung und Praxis des IOC in der Go-Sprache: Detaillierte Erläuterung der Kontrollumkehr Apr 07, 2024 pm 02:33 PM

Inversion of Control ist ein Entwurfsmuster, das die Objekterstellung und Abhängigkeitsverwaltung vom Clientcode in den Container verlagert und so die Flexibilität und Testbarkeit des Codes verbessert. Die Implementierung von IOC in der Go-Sprache kann das Wire-Framework verwenden. Zu den spezifischen Schritten gehören: Definieren von Schnittstellen, Definieren von Typen und Verwenden von Wire-Funktionen. Durch die Verwendung drahtgenerierter Container können Sie die Vorteile einer verbesserten Testbarkeit, Flexibilität und einer vereinfachten Konfiguration nutzen.

Wie implementiert der Java-Reflexionsmechanismus das dynamische Laden von Klassen? Wie implementiert der Java-Reflexionsmechanismus das dynamische Laden von Klassen? May 04, 2024 pm 03:42 PM

Der Java-Reflektionsmechanismus ermöglicht das dynamische Laden und Instanziieren von Klassen zur Laufzeit, und Klassenmetadaten können über Klassen im Paket java.lang.reflect, einschließlich Klasse, Methode und Feld, manipuliert werden. Anhand praktischer Beispiele zum Laden der Beispielklasse, zum Instanziieren von Objekten sowie zum Abrufen und Aufrufen von Methoden können Sie deren Anwendung in dynamisch geladenen Klassen demonstrieren und so Programmierprobleme lösen und die Flexibilität verbessern.

See all articles