首页 > 其他分享 >反射

反射

时间:2023-09-25 19:05:00浏览次数:37  
标签:反射 Console dll WriteLine using new Class1

反射是指对一个程序集中的元数据进行检查的过程。说明白一点,就是可以访问和使用一个dll里面所有的东西,并且是运行动态时的调用,而不是普通编译时的绑定,这样使程序更加的自由和灵活,但是性能较低。

反射一般可以用于:插件的开发、特性和程序的动态调用等等。

1.首先我们写一个类,实现他的构造方法。

using System;
 
namespace ClassLibrary1
{
    public class Class1
    {
        public Class1()
        {
            Console.WriteLine("无参构造");
        }
        public Class1(string a)
        {
            Console.WriteLine("有参构造");
        }
        public string A(int a, int b)
        {
            return "有参数有返回值:" + a + b;
        }
 
        public void B(int a, int b)
        {
            Console.WriteLine("有参数无返回值:" + a + b);
        }
        public void C()
        {
            Console.WriteLine("无参无返回值");
        }
    }
}

2.接下来我们使用反射调用

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
 
namespace ConsoleApp4
{
    static class Program
    {
        static void Main(string[] args)
        {
 
            Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + @"a\ClassLibrary1.dll");   //获取整个dll文件
            Type type = assembly.GetType("ClassLibrary1.Class1");       //获取dll中的类型,参数是命名空间.类名
            ConstructorInfo info2 = type.GetConstructor(new Type[] { typeof(string) });
            info2.Invoke(new object[] { "asd" });                     //执行有参构造函数
            Console.WriteLine("####################");
 
            Type type1 = assembly.GetType("ClassLibrary1.Class1");       //获取dll中的类型,参数是命名空间.类名
            MethodInfo mi1 = type1.GetMethod("A");                        //调用方法A
            Object obj1 = Activator.CreateInstance(type1);                //快速实例化,相当于new
            object[] objParams1 = new object[] { 1, 2 };                  //方法的参数
            Object returnValue = mi1.Invoke(obj1, objParams1);            //接收参数
            Console.WriteLine(returnValue);
            Console.WriteLine("####################");
 
            Type type2 = assembly.GetType("ClassLibrary1.Class1");       //获取dll中的类型,参数是命名空间.类名
            MethodInfo mi2 = type2.GetMethod("B");                        //调用方法B
            Object obj2 = Activator.CreateInstance(type2);                //快速实例化,相当于new
            object[] objParams2 = new object[] { 1, 2 };                  //方法的参数
            mi2.Invoke(obj2, objParams2);                                 //执行
            Console.WriteLine("####################");
 
            Type type3 = assembly.GetType("ClassLibrary1.Class1");       //获取dll中的类型,参数是命名空间.类名
            MethodInfo mi3 = type3.GetMethod("C");                        //调用方法C
            Object obj3 = Activator.CreateInstance(type3);                //快速实例化,相当于new
            mi3.Invoke(obj3, null);                                       //执行
 
            Console.ReadKey();
        }
    }
}
其中Assembly.LoadFile和Assembly.LoadFrom是有区别的。
Assembly.LoadFile,只加载自己,不加载依赖项,意思就是除过自己,不加载关联的dll。
Assembly.LoadFrom,不仅加载自己,还加载依赖项,除过自己,还加载自己关联其他的dll。
大部分的内容都在type点里面,里面包含了所有的对象,比如字段,属性,方法等等

标签:反射,Console,dll,WriteLine,using,new,Class1
From: https://blog.51cto.com/u_15585624/7598055

相关文章

  • go 反射
     一.go反射介绍和定义 在Go语言中,反射机制是一种动态获取变量类型和值信息的机制,它可以让程序在运行时动态地获取对象的类型信息、调用对象的方法、修改对象的属性等。通过反射机制,Go程序可以更加灵活和可扩展,但同时也会带来一些性能开销和复杂度。在Go语言中,反射机制主......
  • 在 Net7.0环境下通过反射创建对象和调用方法
    一、介绍最近没事干,就用闲暇时间写点东西,也记录一下温习历程。老人说的好,好记性,不如烂笔头。时间一长,当时记忆的再清楚,都会变得模糊,索性就写博客记录下来,如果下次需要,直接打开博客就找到了,不用去网上乱找了。今天我要写一些有关反射创建类型实例和调用方法的文章,......
  • 反射修改String中的value属性(char[])
    上图结论:可以通过反射获取String对象的value属性,然后有两种方式修改:1.构建一个新的char[]数组进行替换 2.构建一个char[]指向同一对象,对该对象中的内容进行修改(即char[0='X'])反射结论:对于private修饰的字段,可以利用setAccessible(true)函数处理;同时,反射可以直接处理final或者s......
  • AOP和反射的使用——自动填充公共字段
      在写业务代码时候,我们经常会在业务层对数据实体进行一些重复的传参,例如更新日期时间。这太麻烦了,为了减轻代码量,我们可以利用AOP和反射对代码进行一些调整,免去这些重复操作。也帮助我们对反射的实际应用有一定认识。   首先自定义一个注解@Target(ElementType.METHOD)//......
  • Java反射
    声明:本文记录基于JDK8(8u211)的继承使用规则如果存在错误,请发邮件至[email protected]联系我创作时间:2023-09-1617:00:21创作情况:失业第46天,地处成都金牛区创作者:一口吃不成胖子反射准备工作,以供对照描述与代码,想看结论直接到文末尾父类packagecom.beans;/***抽象......
  • JAVA反射(一)获取Class对象的三种方式及其区别
    publicclassClassModel{static{System.out.println("staticblock");}{System.out.println("dynamicblock");}}publicclassClassTest{publicstaticvoidmain(String[]args){//方式......
  • 深入理解Java中的反射机制
    什么是反射机制Java中的反射机制是指在运行时获取类的信息并操作类的属性、方法和构造函数等。通过反射机制,我们可以在运行时动态地创建对象、调用方法和访问属性等,而不需要在编译时确定这些信息。反射机制的应用场景反射机制在Java中有着广泛的应用场景,比如:动态代理动态代......
  • 反射实现插件式开发
    前言插件式架构,一种全新的、开放性的、高扩展性的架构体系。插件式架构设计好处很多,把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现。扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。基于插件设计并不神秘,相反它比起一团泥......
  • 3.反射
    JAVA反射机制:是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。一个反射解析器:运用泛型、反射、集合类等相关知识实现一个API参数解析器......
  • 第二十章 反射机制
    20.1基本概念通常情况下编写代码都是固定的,无论运行多少次执行的结果也是固定的,在某些特殊场合中编写代码时不确定要创建什么类型的对象,也不确定要调用什么样的方法,这些都希望通过运行时传递的参数来决定,该机制叫做动态编程技术,也就是反射机制。通俗来说,反射机制就是用于动......