Réflexion et COI
Réflexion
Le mécanisme de réflexion est en cours d'exécution Pour n'importe quelle classe, il peut connaître tous les attributs et attributs de. cette classe. Méthode ; pour n'importe quel objet, n'importe laquelle de ses méthodes peut être appelée ; cette fonction d'obtention dynamique et d'appel dynamique des méthodes de l'objet est appelée le mécanisme de réflexion. Le mécanisme de réflexion obtient et utilise dynamiquement des méthodes, ce qui est complètement différent de la création directe d'un objet d'une classe et de son appel direct. Par exemple, s'il existe une propriété ou une méthode dans une classe qui est privée, nous ne pouvons pas l'appeler directement, mais nous pouvons utiliser le mécanisme de réflexion pour l'appeler dynamiquement.
IOC
Le plus grand avantage d'IOC est de mettre la génération d'objets on Il est défini en XML, donc lorsque nous aurons besoin de changer une sous-classe d'implémentation, cela deviendra très simple (généralement, ces objets sont implémentés dans une sorte d'interface), il suffit de modifier le XML, afin que nous puissions même réaliser la nouveauté du objet Branchez et débranchez (un peu comme l’interface USB et le disque dur SCSI). Avant que IOC ne soit applicable, si un objet dépend d'un autre objet (ci-après dénommé objet dépendant et objet dépendant), nous devons instancier un objet dépendant dans l'objet dépendant afin que la méthode dans l'objet dépendant puisse être appelée. Évidemment, ce degré de couplage est relativement élevé et n'est pas conforme à nos principes de programmation. Par conséquent, nous allons maintenant introduire un objet tiers, qui est chargé de fournir directement un objet dépendant à l'objet dépendant, réduisant ainsi le couplage entre les deux. La figure ci-dessous montre la comparaison du couplage d'objets dans le système avant et après l'ajout du conteneur IOC
Avant l'introduction du conteneur IOC dans le système logiciel, comme le montre la figure 1, l'objet A dépend de l'objet B. Ensuite, l'objet A doit le créer activement lorsqu'il est initialisé ou s'exécute jusqu'à un certain point ou utilise un objet B déjà créé. Que vous créiez ou utilisiez l’objet B, le contrôle est entre vos mains.
Après l'introduction du conteneur IOC dans le système logiciel, cette situation a complètement changé. Comme le montre la figure 2, en raison de l'ajout du conteneur IOC, la connexion directe entre l'objet A et l'objet B a été perdue. A s'exécute lorsque l'objet B est nécessaire, le conteneur IOC crée activement un objet B et l'injecte à l'emplacement où l'objet A est nécessaire.
Grâce à la comparaison avant et après, il n'est pas difficile de voir que le processus de dépendance de l'objet A à l'objet B passe d'un comportement actif à un comportement passif, et que les droits de contrôle sont inversés. C'est l'origine du nom ". Inversion du contrôle".
Instance
Code de l'instance de réflexion
<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>
Résultat en cours
Exemple de code CIO
<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>
<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>
<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>
Exécuter les résultats
Ce qui précède est le contenu de la réflexion et du CIO. Pour plus de contenu connexe, veuillez prêter attention à. le site PHP chinois (www .php.cn) !

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





Le mécanisme de réflexion permet aux programmes d'obtenir et de modifier des informations de classe au moment de l'exécution. Il peut être utilisé pour implémenter la réflexion d'interfaces et de classes abstraites : Réflexion d'interface : obtenez l'objet de réflexion d'interface via Class.forName() et accédez à ses métadonnées (nom, méthode et champ) . Réflexion de classes abstraites : Semblable aux interfaces, vous pouvez obtenir l'objet de réflexion d'une classe abstraite et accéder à ses métadonnées et méthodes non abstraites. Cas pratique : Le mécanisme de réflexion peut être utilisé pour implémenter des proxys dynamiques, en interceptant les appels aux méthodes d'interface au moment de l'exécution en créant dynamiquement des classes proxy.

Vous pouvez utiliser la réflexion pour accéder aux champs et méthodes privés en langage Go : Pour accéder aux champs privés : obtenez la valeur de réflexion de la valeur via Reflect.ValueOf(), puis utilisez FieldByName() pour obtenir la valeur de réflexion du champ, et appelez le Méthode String() pour imprimer la valeur du champ. Appelez une méthode privée : obtenez également la valeur de réflexion de la valeur via Reflect.ValueOf(), puis utilisez MethodByName() pour obtenir la valeur de réflexion de la méthode, et enfin appelez la méthode Call() pour exécuter la méthode. Cas pratique : modifiez les valeurs des champs privés et appelez des méthodes privées par réflexion pour obtenir le contrôle des objets et la couverture des tests unitaires.

Reflection fournit des fonctionnalités de vérification et de modification de type dans Go, mais il présente des risques de sécurité, notamment l'exécution de code arbitraire, la falsification de type et la fuite de données. Les meilleures pratiques incluent la limitation des autorisations et des opérations réfléchissantes, l'utilisation de listes blanches ou de listes noires, la validation des entrées et l'utilisation d'outils de sécurité. En pratique, la réflexion peut être utilisée en toute sécurité pour inspecter les informations de type.

La réflexion du langage Go vous permet de manipuler des valeurs de variables au moment de l'exécution, notamment en modifiant les valeurs booléennes, les entiers, les nombres à virgule flottante et les chaînes. En obtenant la valeur d'une variable, vous pouvez appeler les méthodes SetBool, SetInt, SetFloat et SetString pour la modifier. Par exemple, vous pouvez analyser une chaîne JSON dans une structure, puis utiliser la réflexion pour modifier les valeurs des champs de la structure. Il convient de noter que l'opération de réflexion est lente et que les champs non modifiables ne peuvent pas être modifiés. Lors de la modification de la valeur du champ de structure, les champs associés peuvent ne pas être automatiquement mis à jour.

La fonctionnalité de réflexion du langage Go permet à un programme d'inspecter et de modifier la structure d'un type au moment de l'exécution. En utilisant Type, Value et Reflect.Kind, nous pouvons obtenir les informations de type, les valeurs de champ et les méthodes de l'objet, et nous pouvons également créer et modifier des objets. Les méthodes d'opération spécifiques incluent : la vérification du type (TypeOf()), l'obtention de la valeur du champ (ValueOf(), FieldByName()), la modification de la valeur du champ (Set()) et la création d'un objet (New()).

L'inversion de contrôle est un modèle de conception qui déplace la création d'objets et la gestion des dépendances du code client vers le conteneur, améliorant ainsi la flexibilité et la testabilité du code. L'implémentation d'IOC en langage Go peut utiliser le framework wire. Les étapes spécifiques incluent : la définition des interfaces, la définition des types et l'utilisation des fonctions wire. En utilisant des conteneurs générés par fil, vous pouvez bénéficier des avantages d’une testabilité améliorée, d’une flexibilité et d’une configuration simplifiée.

En utilisant la réflexion, Go permet la création de nouveaux types. 1. Utilisez Reflect.TypeOf() pour obtenir la valeur Reflect.Type d'un type existant ; 2. Utilisez Reflect.New() pour créer une valeur de pointeur d'un nouveau type ; . Via *Ptr.Elem( ) pour accéder à la valeur réelle ; 4. La réflexion peut également créer dynamiquement de nouveaux types basés sur des chaînes, qui sont utilisées pour créer des programmes flexibles et dynamiques.

Réponse : Oui, la réflexion en langage Go peut implémenter une programmation orientée aspect. Description détaillée : Reflection permet à un programme de modifier et d'inspecter ses propres types et valeurs au moment de l'exécution. Grâce à la réflexion, nous pouvons créer des aspects globaux pour le code, qui sont déclenchés avant et après l'exécution de la fonction. Cela nous permet d'ajouter facilement des fonctionnalités telles que la journalisation sans modifier le code existant. Reflection offre les avantages du découplage du code, de l'évolutivité et du contrôle flexible, améliorant ainsi la maintenabilité et la réutilisation des applications.
